用数字Linux / Unix排序文件的行

时间:2013-04-05 19:48:23

标签: linux file unix sorting command-line

我有两个我想要比较的文件。一个文件订购号码

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

我会做什么来进行数字排序,但最终会得到底部的字母?或者,如果不这样做,是否有办法排除以特定字符开头的行?

4 个答案:

答案 0 :(得分: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的底部。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我确信有很多方法可以做到这一点。这是一种方式。用您的输入文件名替换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

答案 3 :(得分:0)

您可以在运行排序之前拔出标题行,然后将其添加回来。如果您有$n行标题,则以下内容会将其后的所有内容都删除:

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

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

如果你真的希望按字母顺序排序,那么我就会把以文本开头的行抓到一个文件中,将以数字开头的行grep写入第二个文件,排序他们分开,然后结合起来。希望有所帮助。