更改uniq -c输出中的列顺序

问题描述

我正在使用此脚本读取文件,并向我显示文件中的唯一名称,还向我显示名称文件中存在多少次(计数)

n==1

输出

n > 1

我想更改此格式,我想先输入姓名,然后再输入计数,我该如何使用上述脚本

john
john
William
wad
William
john
wad
john
wad
john
William
john
wad
john
wad
wad
john
john

cat student.txt | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10

解决方法

您的管道太长了。 Awk为此具有关联数组:

$ awk '{++count[$1]} END {for (name in count) print name,count[name]}' student.txt |
sort -nr -k 2
john 9
wad 6
William 3
,

附加到您的命令:

| awk '{print $2,$1}'
,

使用Perl: 该命令对每条输入行的出现次数进行计数,将输出从最频繁到最不频繁进行排序,并打印每行,其后是计数(制表符分隔):

echo William Wad John William John William William | xargs -n1 | \
    sort | uniq -c | sort -nr | \
    perl -lane 'print join "\t",reverse @F'

打印:

William 4
John    2
Wad     1

Perl单行代码使用以下命令行标志:
-e:告诉Perl在代码中而不是在文件中查找代码。
-n:一次遍历输入一行,默认情况下将其分配给$_
-l:在直接执行代码之前,先剥离输入行分隔符(默认为* NIX上的"\n"),并在打印时附加它。
-a:在空白或$_选项中指定的正则表达式上,将@F拆分为数组-F

print join "\t",reverse @F:从右到左阅读:反转数组@F(输入字段),将制表符上的元素连接成字符串,然后打印该字符串。

要将制表符替换为空白,请使用:
print join " ",reverse @F