awk單獨將是最適合您的更新問題。
$ awk '{file[$0]++; count[$1]++; max_count= count[$1]>max_count?count[$1]:max_count;} END{ k=1; for(n=1; n<=max_count; n++){ for(i in count) if(count[i]==n) ordered[k++]=i} for(j in ordered) for(line in file) if (line~ordered[j]) print line; }' file
Alsounique zebra
Thislineisunique cat
Alsonotunique beaver
Alsonotunique monkey
Notunique parrot
Notunique dog
Notunique dragon
說明:
部分-1:
{file[$0]++; count[$1]++; max_count= count[$1]>max_count?count[$1]:max_count;}
:
我們在存儲陣列file
輸入文件; count
數組會跟蹤每個唯一第一個字段的計數,這是您希望對文件進行排序的基礎。 max_count
跟蹤最大數量。
部分-2: 一旦AWK讀完文件中,count
內容將是如下:如圖所示(鍵,值)
Alsounique 1
Notunique 3
Thislineisunique 1
Alsonotunique 2
現在我們的目標是通過數值這些鍵進行排序下面。這是我們關鍵的一步,對於下面輸出中的每個字段/鍵/列1,我們將遍歷file
數組並打印包含這些鍵的行,它會給我們提供最終所需的輸出。
Alsounique
Thislineisunique
Alsonotunique
Notunique
下面迴路確實存儲另一個陣列count
陣列的內容的操作在sorted by values
方式稱爲ordered
。 ordered
的內容將與上面顯示的輸出相同。
for(n=1; n<=max_count; n++)
{
for(i in count)
if(count[i]==n)
ordered[k++]=i
}
的最後一步:即遍歷file
陣列和存儲在ordered
陣列的字段的順序打印的行。
for(field in ordered)
for(line in file)
if (line~ordered[field])
print line;
}
溶液-2:
另一可能的解決方案將使用排序,uniq的和AWK /切割。但是如果你的輸入文件非常大,我不會推薦使用它,因爲多個管道調用多個進程會減慢整個操作。
$ cut -d ' ' -f1 file | sort | uniq -c | sort -n | awk 'FNR==NR{ordered[i++]=$2; next} {file[$0]++;} END{for(j in ordered) for(line in file) if (line~ordered[j]) print line;} ' - file
Alsounique zebra
Thislineisunique cat
Alsonotunique beaver
Alsonotunique monkey
Notunique parrot
Notunique dog
Notunique dragon
以前的解決方案(OP編輯之前的問題)
這可以通過使用sort
,uniq
和awk
這樣進行:
$ uniq -c <(sort f1) | sort -n | awk '{ for (i=1; i<$1; i++){print}}1'
1 Also unique
1 This line is unique
2 Also not unique
2 Also not unique
3 Not unique
3 Not unique
3 Not unique
你能證明你有什麼嘗試到目前爲止?我會使用一個簡短的Python腳本,使用'collections.Counter'可以非常簡短,但這對純粹的'shell'解決方案不起作用。 – norok2