次のような非常に長いファイルがあります
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
.
.
.
2番目のフィールドで最初の20個の繰り返し数を探したいです。
まず、2番目のフィールドに最も頻繁に繰り返される数字を持つ行のリストを印刷します。
その後、第2のフィールドに対して第2の繰返し数字等が続く。
答え1
あなたの質問のデータが次の場所にあるとしますfile
。
$ awk '{ print $2 }' <file | sort | uniq -c | sort -rn | head -n 20
23 36141
9 36280
与えられたデータでは、2番目のフィールドには2つの固有番号しかありません(36141は23回発生し、36280は9回発生します)。
パイプは2番目の列を抽出するために使用されますawk
(cut -f 2
またはデータがタブで区切られた場合に使用)。次に、この数字のリストを並べ替え、uniq -c
各数字が表示される回数を計算します。sort -rn
数を最大から最小の順に並べ替えて、最終的にhead -n 20
リストを20個の一意の数字に減らします(例データでは2個の数字のみが一意です)。
答え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
:2番目のフィールドを印刷します。sort
:この場合、PIDはすでに隣接しているため必要ありません。いつもそういうのかはわかりません。uniq
:固有数とPID印刷sort
:逆順数字(最も高い数字から)
メインスクリプト
プロセス置換結果(20行に制限、無視)とソースファイルを入力として使用します。 PIDを2つの配列に保存a
したらb
、入力ファイルを処理し、必要な行を配列に保存しc
て印刷します。
- array
a
:クエリに使用されるインデックスであるPID - array
b
:出力の順序を維持するためのPIDマップのインデックス - array
c
:印刷する行を保存します(PIDをインデックスとして)。