다음과 같은 매우 긴 파일이 있습니다
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
주어진 데이터에서 두 번째 필드에는 고유 번호가 2개만 있습니다(36141은 23번 발생하고 36280은 9번 발생).
파이프는 두 번째 열을 추출하기 위해 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
:두 번째 필드를 인쇄합니다.sort
: 이 경우에는 PID가 이미 인접해 있기 때문에 필요하지 않습니다. 항상 그런 것인지는 확실하지 않습니다.uniq
: 고유 개수 및 PID 인쇄sort
:역순 숫자(가장 높은 숫자부터)
메인 스크립트
프로세스 대체 결과(20줄로 제한, 무시됨) 및 원본 파일을 입력으로 사용합니다. PID를 두 개의 배열에 저장 a
한 b
후 입력 파일을 처리하고 필요한 라인을 배열에 저장 c
하고 인쇄합니다.
- array
a
: 조회에 사용되는 인덱스인 PID - array
b
: 출력의 순서를 유지하기 위한 PID 맵의 인덱스 - array
c
: 인쇄할 행을 저장합니다(PID를 인덱스로).