排序命令不适用于大文件

时间:2019-01-07 08:13:28

标签: linux shell sorting unix terminal

我有一个文本文件,其中包含技能名称列表(近1.5亿行)。我使用命令

对此进行了排序
sort myFile.txt >> SortedFile.txt 

为验证此命令的结果,我执行了命令

grep -n "^JavaScript$" SortedFile.txt >> lineNumbers.txt 

我可以看到JavaScript分为两组。一组来自27819903 - 28071139,另一组来自99390179 - 99607141

此问题不仅与技能“ JavaScript”有关,而且在许多技能中也会发生。 sort命令有什么问题?

如何使用sort命令正确对myFile进行排序?

1 个答案:

答案 0 :(得分:2)

没有测试数据很难说清(a),但是由于它分为两部分,所以我的第一个建议是更改:

sort myFile.txt >> SortedFile.txt

收件人:

sort myFile.txt > SortedFile.txt

其中第一个简单地将结果追加到一个可能已经存在的文件中,因此,如果两次执行,则分成两个不同的部分。与您用于发现行号的grep命令同上。

我希望,如果您使用相同的源,则会得到两个大小相等的块(此处不是这种情况),但是我不知道文件中的之前您已将其附加。

因此,请尝试不添加任何内容,看看是否有相同的问题。


我想问自己的另一件事是:为什么要对它进行排序?在我看来(尽管我以前做错了,只是问我的妻子一个完整的清单),这里唯一可能的用例是计算每种技能的数量。我很难设想任何其他可能性,但是,如果您有其他可能性,请告诉我们,对于不同的用例,可能还有同样更好的方法。

如果是计数 的话,有比排序更好的方法,您可以简单地对它们进行计数而无需考虑顺序,例如:

awk '{count[$1]++}END{for(key in count){print key" "count[key]}}'

请参见以下命令作为示例:

pax> ( echo JavaScript; echo C; echo Java; echo JavaScript ) | awk '
...>    {count[$1]++}END{for(key in count){print key" "count[key]}}'

这将生成:

C 1
Java 1
JavaScript 2

(a)而且三位数演出可能是太多测试数据,无法发布:-)