我有一个文件,其中列出了 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
在上面awk
,seen[$0]++
对于每个右记录,S用空格或\n
ewline 分隔将整个记录存储到称为seen
键的关联数组中,并且当再次看到相同的键时其值会递增。
当END{ ... }
读取所有记录时,将执行此块,并且对于每个键(我们定义x
为变量索引来遍历该数组中的所有元素)为了循环)保存在数组中,我们使用了值见过 seen[x]
作为新数组的键调用,count
并且同一键的值再次增加。
后来我们使用另一个循环和y
变量索引来首先打印它们的值count[y]
(这是计数)和y
它们的键。