열의 값을 계산하되 일치하는 패턴이 처음 발생한 이후의 행만 고려합니다.

열의 값을 계산하되 일치하는 패턴이 처음 발생한 이후의 행만 고려합니다.

특정 명령의 출력에서 ​​두 번째 열의 값을 계산해야 합니다. 그러나 문제는 특정 패턴이 포함된 줄 다음의 줄만 고려하면 된다는 것입니다. 예:
명령 출력(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] }'

sedsup파일의 첫 번째 줄부터 끝까지 모든 줄을 인쇄합니다 . 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이 답변을 업데이트했습니다. :)

관련 정보