awk/sed 또는 다른 방법

awk/sed 또는 다른 방법

파일(1000줄 이상)이 있는데 어떤 형식으로든 출력을 가져와야 합니다. 각 행에 몇 개의 행이 있는지 확인해야 합니다 thr. 아래의 경우에는 3 thr개가 있고 5, 4, 2는 각각 각 행의 개수입니다 thr.

입력하다:

19608250477[thr=22321]: Res90 at
1: 0x00007f1fb38d5089 
2: 0x00007f1fb5565c79 
3: 0x00007f1fbb097775 
4: 0x00007f1fbb034a69 
5: 0x00007f1fbb035467 
19601889333[thr=19068]: Res87 at
1: 0x00007f1fc15f86c0 
2: 0x00007f1fc1a27d7c 
3: 0x00007f1fc1d0f312 
4: 0x00007f1fc1caf054 
16236545786[thr=55528]: Res67 at
1: 0x00007f1fb4959a90 
2: 0x00007f1fb557ad94 

아래와 같은 출력이 필요합니다.

thr=22321 ; Count 5 # Count number of lines for each thr ; Each content will start with number (1: and finish with some numebr  
thr=19068 ; Count 4
thr=55528 ; Count 2

답변1

awk -F'[]=[]' '
    function print_count() {
        printf "thr=%d ; Count %d\n", key, count
    }
    $2 == "thr" {if (key) print_count(); key = $3; count = 0; next}
    {count++}
    END {print_count()}
' file

이는 ]또는 필드 구분 기호 =로 사용됩니다.[

답변2

또 다른 이상한:

awk -F'[][]' '
  function p_c () {
    print a" ; Count "b
  }
  NF == 3 {
    if ( f )
      p_c()
    a = $2
    f = 1
    next
  }
  {
    b = $1
    sub ( ":.*" , "" , b )
  }
  END {
    p_c()
  }
' infile

답변3

또 다른 awk솔루션은 레코드 및 필드 구분 기호 정의를 활용합니다.

$ awk -v RS="[0-9]+[[]" -v FS="\n" -v OFS=";" '$0 {gsub(/[]].*/, "", $1); print $1,"Count "NF-2}' input

관련 정보