0

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

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

4 回答 4

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 的底部。

于 2013-04-05T20:15:05.617 回答
0

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

于 2013-04-05T19:50:39.503 回答
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

于 2013-04-05T20:08:06.390 回答
0

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

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

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

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

于 2013-04-05T20:11:04.373 回答