【问题标题】:How to sort a file in-place如何就地对文件进行排序
【发布时间】:2015-05-28 10:56:38
【问题描述】:

当我们使用sort file 命令时, 文件以排序的方式显示其内容,如果我不想得到任何类型的输出而是排序文件怎么办?

【问题讨论】:

  • 请更新您的问题,以清楚地说明您想要对文件排序的结果做什么。您想对其进行排序,将file 的未排序内容替换为同一文件的排序内容吗?你的问题目前陈述的方式,什么都不做是一个正确的答案(你不想要任何输出,所以不要做任何事情)。
  • @KeithThompson 实际上感谢您的关注,我试图对文件进行排序,但想避免在屏幕上输出。
  • 那么您希望输出到哪里?进入新文件?进入原始文件?去楼下的打印机?
  • 进入原始文件
  • @AliSajid:那么请更新你的问题,这样你的问题对其他有同样问题的读者有用。

标签: linux bash shell unix


【解决方案1】:

您可以使用文件重定向来重定向排序后的输出:

sort input-file > output_file

或者你可以使用sort的-o,--output=FILE选项来表示同一个输入输出文件:

sort -o file file

不重复文件名(使用bash brace expansion

sort -o file{,}

⚠️ 注意: 一个常见的错误是尝试将输出重定向到同一个输入文件 (例如sort file > file)。这不起作用,因为 shell 正在进行重定向(不是 sort(1) 程序)并且输入文件(也作为输出)将在给出 sort( 1) 安排阅读的机会。

【讨论】:

  • 只是提到顺序的重要性。来自GNU sort 信息页面:-o OUTPUT-FILE' --output=OUTPUT-FILE' 将输出写入 OUTPUT-FILE 而不是标准输出。在较新的系统上,-o' cannot appear after an input file if POSIXLY_CORRECT' 被设置,例如,sort F -o F'. Portable scripts should specify -o OUTPUT-FILE' 在任何输入文件之前。
【解决方案2】:

sort 命令默认将排序操作的结果打印到标准输出。为了实现“就地”排序,您可以这样做:

sort -o file file

这会用排序后的输出覆盖输入 file-o 开关,用于指定输出,is defined by POSIX,因此应该在所有版本的sort 上都可用:

-o 指定要使用的输出文件的名称,而不是标准输出。此文件可以与输入文件之一相同。

如果您不幸拥有一个没有-o 开关的sort 版本(Luis 向我保证它们存在),您可以以标准方式实现“就地”编辑:

sort file > tmp && mv tmp file

【讨论】:

    【解决方案3】:
    sort file | sponge file
    

    这在以下 Fedora 包中:

    moreutils : Additional unix utilities
    Repo        : fedora
    Matched from:
    Filename    : /usr/bin/sponge
    

    【讨论】:

    • 使用sudo apt install moreutils安装后,这也适用于Ubuntu
    【解决方案4】:

    这是一种(ab)使用vim的方法:

    vim -c :sort -c :wq -E -s "${filename}"
    

    -c :sort -c :wq 部分在文件打开后调用 vim 命令。 -E-s 是必要的,以便 vim 以不绘制到终端的“无头”模式执行。

    这与sort -o "${filename}" "${filename}" 方法相比几乎没有任何好处,只是它只接受文件名参数一次。


    这对我在 nanorc 文件的 nanorc 条目中实现 formatter 指令很有用。这是我用来做的:

    syntax "gitignore" "\.gitignore$"
    
    formatter vim -c :sort -c :wq -E -s
    

    【讨论】:

    • 您在nanorc 中使用vim?哦,具有讽刺意味。
    【解决方案5】:

    要对文件进行就地排序,请尝试:

    echo "$(sort your_file)" > your_file
    

    正如其他答案中所解释的,您不能直接将输出重定向回输入文件。但是您可以先评估sort 命令,然后将其重定向回原始文件。这样就可以实现就地排序了。

    同样,您也可以将此技巧应用于其他命令,例如paste,以实现逐行追加。

    【讨论】:

    • 这很糟糕,因为它不适用于大文件,带结束换行符,echo 可能会在 POSIX 中与反斜杠转义混淆,而-o 确实适用于与输入相同的文件,如在:stackoverflow.com/a/29244387/895245
    【解决方案6】:

    您想对文件夹和子文件夹中的所有文件进行排序以覆盖它们吗?

    使用这个:

    find . -type f -exec sort {} -o {} \;
    

    【讨论】:

      【解决方案7】:

      没有关于少数文件的答案,所以:

      sort -u file1 file2 -o file1
      

      【讨论】:

        猜你喜欢
        • 2010-11-08
        • 2020-09-11
        • 2011-12-20
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        相关资源
        最近更新 更多