簡體   English   中英

“sort filename | uniq“不適用於大文件

[英]“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

解決:不同的行分隔符

sort(1)命令接受-u選項以獲得key的唯一性。

只是用

 sort -u big_list.txt

您可以規范化行分隔符(將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

重點:

  1. $0表示當前記錄 ,通常是當前行
  2. awkACTION部分是可選的,默認操作是{ print; } { print; }
  3. 算術上下文中,未初始化的var為0

除了sort -u你還可以使用awk '!_[$0]++' yourfile

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM