打印第二个字段中的大部分重复数字

打印第二个字段中的大部分重复数字

我们有以下很长的文件

    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 次)。

管道使用awkcut -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:打印唯一计数和 PID
  • sort:反转数字(最高计数在前)

主要脚本

使用进程替换的结果(限制为 20 行,忽略计数)和原始文件作为输入。将 PID 保存在两个数组a和中b,然后处理输入文件并将所需的行存储在数组中c并打印它们。

  • array a: PID 作为用于查找的索引
  • array b: PID 映射的索引以维护输出中的顺序
  • array c: 存储要打印的行(PID 作为索引)

相关内容