如何计算 uniq -c 生成的第一列

如何计算 uniq -c 生成的第一列

我有一个文件,其中列出了 5 行随机单词“See Spot”“See pot run”等,每行占一个新行。我能够创建代码来计算每个单词在文件中出现的次数并正确排序。

4 Spot  
3 run  
2 see  
1 sees  
1 Run  
1 Jane  

我使用的代码:

cat "FILENAME" | tr ' ' '\n' | sort -n | uniq -c | sort -r  

我将每个单词放在一个新行中,进行排序,然后计算唯一值并再次排序。现在我必须进行计数,但输出如下:

3 1  
1 2  
1 3  
1 4  

这意味着有 3 个单词的计数为 1、1 个单词 2、1 个单词 3、1 个单词 4。

我有两个问题。 1 是如何获得第一列的计数,该计数已经是来自 uniq -c 的计数。第二个问题是删除第二列中的单词并替换为原来的计数1,2,3,4。

答案1

你可以这样做:

tr ' ' '\n' <infile \
 | sort -n \
 | uniq -c \
 | awk '{ seen[$1]++ } END{for (x in seen) print seen[x], x }'

甚至:

tr ' ' '\n' <infile | sort -n | uniq -c|cut -d' ' -f7 |sort |uniq -c

或者单独使用更好awk

awk '{ seen[$0]++ } 
    END{ for (x in seen) count[seen[x]]++; for (y in count) print count[y],y }
' RS='( |\n)+' infile
3 1
1 2
1 3
1 4

在上面awkseen[$0]++对于每个记录,S用空格或\newline 分隔将整个记录存储到称为seen键的关联数组中,并且当再次看到相同的键时其值会递增。

END{ ... }读取所有记录时,将执行此块,并且对于每个键(我们定义x为变量索引来遍历该数组中的所有元素)为了循环)保存在数组中,我们使用了值见过 seen[x]作为新数组的键调用,count并且同一键的值再次增加。

后来我们使用另一个循环和y变量索引来首先打印它们的值count[y](这是计数)和y它们的键。

相关内容