我们有以下很长的文件
llvmpipe- 36141 36258 root mem REG 253,0 534488 201604324 /usr/lib64/libgcrypt.so.11.8.2
llvmpipe- 36141 36258 root mem REG 253,0 27504 201943960 /usr/lib64/libfontenc.so.1.0.0
llvmpipe- 36141 36258 root mem REG 253,0 691680 201604095 /usr/lib64/libfreetype.so.6.10.0
llvmpipe- 36141 36258 root mem REG 253,0 90632 201604087 /usr/lib64/libz.so.1.2.7
llvmpipe- 36141 36258 root mem REG 253,0 153192 201604070 /usr/lib64/liblzma.so.5.0.99
llvmpipe- 36141 36258 root mem REG 253,0 398272 201604073 /usr/lib64/libpcre.so.1.2.0
llvmpipe- 36141 36258 root mem REG 253,0 142304 201603881 /usr/lib64/libpthread-2.17.so
llvmpipe- 36141 36258 root mem REG 253,0 88720 201326789 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
llvmpipe- 36141 36258 root mem REG 253,0 297464 201654760 /usr/lib64/libdw-0.163.so
llvmpipe- 36141 36258 root mem REG 253,0 20024 201610087 /usr/lib64/libcap.so.2.22
llvmpipe- 36141 36258 root mem REG 253,0 44096 201603885 /usr/lib64/librt-2.17.so
llvmpipe- 36141 36258 root mem REG 253,0 2107800 201596079 /usr/lib64/libc-2.17.so
llvmpipe- 36141 36258 root mem REG 253,0 1141560 201596087 /usr/lib64/libm-2.17.so
llvmpipe- 36141 36258 root mem REG 253,0 118792 201604116 /usr/lib64/libaudit.so.1.0.0
llvmpipe- 36141 36258 root mem REG 253,0 61648 202097293 /usr/lib64/libpam.so.0.83.1
llvmpipe- 36141 36258 root mem REG 253,0 15616 202097295 /usr/lib64/libpam_misc.so.0.82.0
llvmpipe- 36141 36258 root mem REG 253,0 23888 201868640 /usr/lib64/libXdmcp.so.6.0.0
llvmpipe- 36141 36258 root mem REG 253,0 6976 202124274 /usr/lib64/libxshmfence.so.1.0.0
llvmpipe- 36141 36258 root mem REG 253,0 15512 201686410 /usr/lib64/libXau.so.6.0.0
llvmpipe- 36141 36258 root mem REG 253,0 216840 201943962 /usr/lib64/libXfont.so.1.4.1
llvmpipe- 36141 36258 root mem REG 253,0 715344 201610107 /usr/lib64/libpixman-1.so.0.32.6
llvmpipe- 36141 36258 root mem REG 253,0 54008 202770732 /usr/lib64/libdrm.so.2.4.0
llvmpipe- 36141 36258 root mem REG 253,0 40784 202770730 /usr/lib64/libdl-2.17.so
gnome-ses 36280 gdm mem REG 253,0 11384 203387653 /usr/lib64/libXinerama.so.1.0.0
gnome-ses 36280 gdm mem REG 253,0 251800 201983581 /usr/lib64/libfontconfig.so.1.7.0
gnome-ses 36280 gdm mem REG 253,0 88440 203491884 /usr/lib64/libpangoft2-1.0.so.0.3600.8
gnome-ses 36280 gdm mem REG 253,0 180632 203673069 /usr/lib64/libatk-bridge-2.0.so.0.0.0
gnome-ses 36280 gdm mem REG 253,0 23768 203387616 /usr/lib64/libXfixes.so.3.1.0
gnome-ses 36280 gdm mem REG 253,0 15616 201610125 /usr/lib64/libgmodule-2.0.so.0.4200.2
gnome-ses 36280 gdm mem REG 253,0 40736 203387649 /usr/lib64/libXrandr.so.2.2.0
gnome-ses 36280 gdm mem REG 253,0 1141560 201596087 /usr/lib64/libm-2.17.so
gnome-ses 36280 gdm mem REG 253,0 44096 201603885 /usr/lib64/librt-2.17.so
.
.
.
我们想要找到第二个字段中前 20 个重复的数字
所以首先我们在第二个字段上打印重复数字最多的行列表
然后是第二个字段的第二个重复数字,依此类推
答案1
鉴于您的问题中的数据位于名为file
:
$ awk '{ print $2 }' <file | sort | uniq -c | sort -rn | head -n 20
23 36141
9 36280
在给定的数据中,第二个字段中只有两个唯一数字(36141 出现 23 次,36280 出现 9 次)。
管道使用awk
(cut -f 2
如果数据是制表符分隔的话,则使用)提取第二列。然后对这个数字列表进行排序并uniq -c
计算每个数字出现的次数。sort -rn
按照从大到小的顺序对计数进行排序,最终将head -n 20
列表缩短为 20 个唯一数字(示例数据中只有两个数字是唯一的)。
答案2
awk '
FNR==NR && NR<=20{ a[$2]; b[++cnt]=$2; next }
$2 in a{
if ($2 in c) c[$2]=c[$2] ORS $0 # append line to existing line(s)
else c[$2]=$0 # add first line
}
END{ for (i=1; i<=cnt; i++) print c[b[i]] }
' <(awk '{ print $2 }' file | sort | uniq -c | sort -rn) file
工艺替代
awk
:打印第二个字段sort
:本例中不需要,因为 PID 已经相邻,不确定情况是否总是如此uniq
:打印唯一计数和 PIDsort
:反转数字(最高计数在前)
主要脚本
使用进程替换的结果(限制为 20 行,忽略计数)和原始文件作为输入。将 PID 保存在两个数组a
和中b
,然后处理输入文件并将所需的行存储在数组中c
并打印它们。
- array
a
: PID 作为用于查找的索引 - array
b
: PID 映射的索引以维护输出中的顺序 - array
c
: 存储要打印的行(PID 作为索引)