특정 명령의 출력에서 두 번째 열의 값을 계산해야 합니다. 그러나 문제는 특정 패턴이 포함된 줄 다음의 줄만 고려하면 된다는 것입니다. 예:
명령 출력(ptree) -
1234 화 3342장/빈/사용자/123/loc 7783 저녁 1234알파벳AAA1 BBB1 CCC1 D444 0909알파벳xx11 SD11 lk23 3484 8383현재의uh9u 38tt kj33 SD99 3030지즈qq11 11ii 39ii ij33 0101감독자kk88 sis8 88si mm92 1020zz098df cv99 어린이 8dhd 1111감독자9ike 39ei 93je 39de
첫 번째로 나타나는 sup(세 번째 행)를 찾고 세 번째 행(유사한 값을 그룹화하기 위해) 이후 두 번째 열(굵게 표시)의 모든 값을 계산하려고 합니다. 'sup'이 처음 발생하기 전의 행 수는 고정되어 있지 않으며 언제든지 변경될 수 있습니다(따라서 3으로 하드코딩할 수 없음).
출력은 다음과 같아야합니다 -
abc 2
cur 1
zzz 1
sup 2
zz0 1
누구든지 이 작업을 수행하는 가장 좋은 방법을 제안할 수 있습니까?
답변1
이 시도,
sed -e '1,/sup/d;/^[0-9]/,$d' file.txt | awk 'NF>=3{ a[$2]++ } END { for (n in a) print n, a[n] }'
1,/sup/d
이전 콘텐츠를 모두 삭제합니다.sup
/^[0-9]/,$d
뒤에 다른 프로세스가 있으면 제거됩니다.sup
답변2
첫 번째 조회가 기록될 때 '처리 스위치'를 설정할 수 sup
있으며 스위치가 설정된 경우에만 계산됩니다.
$ gawk '
/sup/ {p=1}
p {a[$2]++}
END {
PROCINFO["sorted_in"] = "@ind_str_asc";
for (i in a) print i, a[i]
}' file
abc 2
cur 1
sup 3
zz0 1
zzz 1
Awk가 PROCINFO
배열 순회 기능을 지원하지 않는 경우 외부 파이프를 통해 출력할 수 있습니다.sort
답변3
@msp9011과 매우 유사
$ sed -n '/sup/,$p' input.txt|awk 'NR>1 {counts[$2]++} END { for(key in counts) print key, counts[key] }'
sed
sup
파일의 첫 번째 줄부터 끝까지 모든 줄을 인쇄합니다 . awk
전달된 두 번째 행부터 시작하여 두 번째 열의 모든 고유 값을 계산합니다. 마지막으로 결과를 인쇄합니다.
편집: @msp9011에서 언급했듯이 이는 그 이후에 더 이상 프로세스가 없다고 가정합니다. 프로세스를 찾으려면 업데이트된 버전이 다음과 같습니다.
$ sed -n '/sup$/,/^[0-9]/p' count.txt|sed -e '1d' -e '$d'|awk '{counts[$2]++} END { for(key in counts) print key, counts[key] }'
sed
숫자로 끝나는 줄부터 숫자로 시작하는 줄까지 sup
모든 내용을 인쇄합니다. 그런 다음 첫 번째와 마지막 행이 삭제되고 awk
계산이 시작됩니다.
EDIT2: @msp9011이 답변을 업데이트했습니다. :)