【问题标题】:Ordering lines of a file numerically Linux/Unix以数字方式对文件的行进行排序 Linux/Unix
【发布时间】:2013-04-05 19:48:22
【问题描述】:

我有两个文件要比较。一档订号

1    somedata  otherdata
2    somedata  otherdata
3    somedata  otherdata
4    somedata  otherdata
5    somedata  otherdata
6    somedata  otherdata
7    somedata  otherdata
8    somedata  otherdata
Y    somedata  otherdata
Y    somedata  otherdata

其他订单

1    somedata  otherdata
10    somedata  otherdata
11    somedata  otherdata
12    somedata  otherdata
.
.
.
2    somedata  otherdata
Y   somedata  otherdata
Y   somedata  otherdata

如果我可以在运行第二个文件之前对第二个文件进行排序(因为第一个文件有一个我想保留的标题。该标题的每一行都以 # 开头。) ,所以我将苹果与苹果进行比较。

我试过了:sort -n /home/me/file.txt -o /home/me/newfile.txt

这几乎是我想要的,但它把字母放在顶部而不是底部。像这样:

    Y    somedata  otherdata
    Y    somedata  otherdata
    1    somedata  otherdata
    2    somedata  otherdata
    3    somedata  otherdata
    4    somedata  otherdata
    5    somedata  otherdata
    6    somedata  otherdata
    7    somedata  otherdata
    8    somedata  otherdata

我会怎么做才能按数字排序但最后是底部的字母?或者,如果做不到这一点,有没有办法排除以某个字符开头的行?

【问题讨论】:

    标签: linux file unix sorting command-line


    【解决方案1】:
    cat /tmp/file.list | sort -n | grep -v ^[A-Z] > /tmp/file.list.sorted; grep ^[A-Z] /tmp/file.list  >> /tmp/file.list.sorted
    

    这将对位于 /tmp/file.list 的文件的内容进行数字排序(排除任何以大写字母开头的字符串)并将内容写入 /tmp/file.list.sorted。然后再次解析原始的 file.list,这次抓取任何以大写字母开头的行,然后将结果附加到 /tmp/file.list.sorted 的底部。

    【讨论】:

      【解决方案2】:

      您可以在运行排序之前拉出标题行,然后再将它们添加回来。如果你有 $n 行标题,那么下面的内容将输出它之后的所有内容:

      head -n $n filewithheader.txt >newfile.txt
      tail -n $((cat filewithheader.txt| wc -l -$n)) | sort -n >>newfile.txt
      

      现在您可以对文件进行同样的排序。

      如果您真的想按字母顺序然后按数字排序,那么我会 grep 将以文本开头的行抓取到一个文件中,将以数字开头的行抓取到第二个文件中,排序将它们分开,然后合并。希望有帮助。

      【讨论】:

        【解决方案3】:

        为什么不在比较之前使用相同的算法对它们进行排序呢?我不确定您是否可以轻松地强制 sort 实用程序执行您所要求的操作。

        【讨论】:

        • 第一个文件顶部有一些元数据,我不想混入。有没有办法排除可能以某个字符开头的行?
        【解决方案4】:

        我相信有很多方法可以做到这一点。这是一种方法。用您的输入文件名代替somedata.txt

        发送到标准输出:

        cat somedata.txt | grep ^[0-9] | sort -n; cat somedata.txt | grep ^[^0-9] | sort
        

        发送至out.txt:

        cat somedata.txt | grep ^[0-9] | sort -n > out.txt; cat somedata.txt | grep ^[^0-9] | sort >> out.txt
        

        上面使用 grep 分别对以数字开头的行和不以数字开头的行进行排序。然后通过管道传输到标准输出或文件out.txt

        【讨论】:

          猜你喜欢
          • 2015-06-27
          • 1970-01-01
          • 1970-01-01
          • 2018-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-08
          相关资源
          最近更新 更多