shell 在bash中排序

9rygscc1  于 2023-06-06  发布在  Shell
关注(0)|答案(3)|浏览(188)

我一直在尝试在bash中获取制表符分隔的文件的每一列中的唯一值。所以,我使用了以下命令。

cut -f <column_number> <filename> | sort | uniq -c

它工作正常,我可以得到列中的唯一值及其计数,如

105 Linux
55  MacOS
500 Windows

我想做的不是按列值名称(在本例中是操作系统名称)排序,而是按计数排序,并可能在此输出格式的第二列中显示计数。因此,它必须看起来像:

Windows 500
MacOS   105
Linux   55

我该怎么做?

u4vypkhs

u4vypkhs1#

您可以使用(其中N是列号,F是输入文件):

cut -f N F |sort |uniq -c |sort -nrk1,1 |awk '{print $2" "$1}'

最初的sort/uniq是以<count> <os>的形式获取每个OS,以便管道的其余部分可以在其上工作。
sort -nrk1,1使用第一个字段(-k1,1)按数字(n)、逆序(r)排序。
然后,awk简单地反转列的顺序。您可以使用以下命令测试整个管道:

pax> cat test.in
a   Windows
b   Linux
c   Windows
d   Windows
e   Linux
f   Windows
g   MacOS
h   Linux
i   Windows
j   MacOS
k   Windows
l   Linux
m   MacOS
n   Windows
o   Linux
p   MacOS
q   Windows
r   Linux
s   Linux
t   Linux
u   Linux
v   Linux

pax> cut -f2 test.in |sort |uniq -c |sort -nrk1,2 |awk '{print $2" "$1}'
Linux 10
Windows 8
MacOS 4

这个测试文件格式在样式上与您自己的输入类似,包括分隔字段的选项卡。它不太可能是完全相同的格式,因此您需要根据自己的文件定制cut命令,以便它只提供所需的列。
然而,你可能已经这样做了,因为这不是你要问的问题。

72qzrwbm

72qzrwbm2#

我的:

cut -f <column_number> <filename> | sort | uniq -c | awk '{ print $2" "$1}' | sort

这将改变列顺序(awk),然后只对输出进行排序。
希望这对你有帮助

brgchamk

brgchamk3#

使用基于标记RE的sed:

cut -f <column_number> <filename> | sort | uniq -c | sort -r -k1 -n | sed 's/\([0-9]*\)[ ]*\(.*\)/\2 \1/'

但不会以整洁的格式生成输出。

相关问题