![](/img/trans.png)
[英]Why does sort -u give different output from sort filename | uniq -u?
[英]“sort filename | uniq” does not work on large files
我可以從小文本文件中刪除重復的條目,但不能刪除大文本文件。
我有一個4MB的文件。
該文件的開頭如下所示:
aa
aah
aahed
aahed
aahing
aahing
aahs
aahs
aal
aalii
aalii
aaliis
aaliis
...
我想刪除重復項。
例如,“aahed”出現兩次,我只希望它出現一次。
無論我試過什么單線,大名單都不會改變。
如果它輸入: sort big_list.txt | uniq | 減
我懂了:
aa
aah
aahed
aahed <-- didn't get rid of it
aahing
aahing <-- didn't get rid of it
aahs
aahs <-- didn't get rid of it
aal
...
但是,如果我從這個文本文件的頂部復制一小部分單詞並在小塊數據上重新運行命令,那么它就能達到預期效果。
這些程序是否拒絕排序,因為文件太大了? 我不認為4MB非常大。 它不輸出警告或任何東西。
我很快編寫了自己的“uniq”程序,它具有相同的行為。 它適用於列表的一小部分,但對4MB文本文件沒有任何作用。 我的問題是什么?
編輯:這是一個十六進制轉儲:
00000000 61 61 0a 61 61 68 0a 61 61 68 65 64 0a 61 61 68 |aa.aah.aahed.aah|
00000010 65 64 0d 0a 61 61 68 69 6e 67 0a 61 61 68 69 6e |ed..aahing.aahin|
00000020 67 0d 0a 61 61 68 73 0a 61 61 68 73 0d 0a 61 61 |g..aahs.aahs..aa|
00000030 6c 0a 61 61 6c 69 69 0a 61 61 6c 69 69 0d 0a 61 |l.aalii.aalii..a|
00000040 61 6c 69 69 73 0a 61 61 6c 69 69 73 0d 0a 61 61 |aliis.aaliis..aa|
61 61 68 65 64 0a
a a h e d \r
61 61 68 65 64 0d
a a h e d \n
解決:不同的行分隔符
您可以規范化行分隔符(將CR + LF轉換為LF):
sed 's/\r//' big_list.txt | sort -u
要回答關於awk '!_[$0]++' file
max taldykin的問題:
awk '!_[$0]++' file
與。相同
awk '!seen[$0]++' file
,這是一樣的
awk '!seen[$0]++ { print; }' file
, 意思是
awk '
{
if (!seen[$0]) {
print;
}
seen[$0]++;
}' file
重點:
$0
表示當前記錄 ,通常是當前行 awk
, ACTION部分是可選的,默認操作是{ print; }
{ print; }
0
除了sort -u
你還可以使用awk '!_[$0]++' yourfile
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.