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