Linux는 각 문자열 앞에 특정 숫자가 나타나는 횟수를 계산합니다.

Linux는 각 문자열 앞에 특정 숫자가 나타나는 횟수를 계산합니다.

나는 이 파일을 가지고 있습니다 :

90  1 
120 1
Transition  
150 1
Transition  
165 1
Transition  
180 1
225 1
240 1
255 1
270 1
Transition  
285 1
Transition  

나는 다음과 같은 출력을 원합니다.

1   2
2   1
3   1
4   5
5   1

즉, 1첫 번째 변환 전에 두 번째 열이 2번 나타납니다. 이를 위해 awk/grep을 어떻게 사용합니까?

답변1

1각 행 앞/사이의 두 번째 필드에서 횟수를 계산하려면 다음과 같이 Transition사용할 수 있습니다 .awk

awk '$2 == "1" {count++;} /Transition/ {t_count++; print t_count "\t" count; count=0;}' <input file>

1필드 2에서 카운터가 증가하고 행이 일치할 때마다 변환 Transition된 행 수의 개수가 인쇄되고 이어서 1행 수가 인쇄됩니다.

내 입력 파일의 출력:

1       2
2       1
3       1
4       5
5       1

답변2

다음은 Perl 솔루션을 사용하는 것입니다.에릭 레노프답변:

$ perl -lane '$F[1]==1 && $c++; if(/Transition/){$k++; print "$k\t$c"; $c=0}' file
1   2
2   1
3   1
4   5
5   1

설명하다

  • -l각 호출에 줄바꿈을 추가합니다 print.
  • -a"awk-mode"를 활성화하고 각 입력 라인을 배열로 분할하여 첫 번째 필드와 두 번째 필드가 되도록 @F합니다 .$F[0]$F[1]
  • -neperl입력 파일을 한 줄씩 처리하고 주어진 스크립트를 각 줄에 적용하도록 지시합니다 -e.
  • $F[1]==1 && $c++;: $c두 번째 필드가 이면 1을 추가합니다 1.
  • if(/Transition/){$k++; print "$k\t$c"; $c=0}': 행이 일치하면 하나를 추가하고 합계의 현재 값을 Transition인쇄 한 후 다시 0으로 설정합니다.$k$k$c$c

답변3

"전환"과 "숫자 뒤에 1" 외에 다른 줄이 있나요? 나는 그렇지 않다고 가정하고 있습니다. 사이에 전환이 없이 두 개의 전환이 있으면 어떻게 되나요? 나는 이것이 일어나지 않을 것이라고 가정하고 있습니다.

특별히 awk를 요청했으므로 Eric의 답변은 완벽합니다. 완전성을 위해 awk가 없는 버전을 제출하고 싶습니다 :)

| sed 's/.* 1 *$/CountThisLine/' | uniq -c | sed -n 's/CountThisLine//p' | nl -nln

첫 번째는 sed계산할 행을 선택하고 변환을 유지하면서 동일하게 만들고, uniq -c동일한 연속 행을 계산하고, 두 번째는 sed변환되지 않은 행만 유지하고 nl결과에 번호를 매깁니다.

$ cat test.txt \
  | sed 's/.* 1 *$/CountThisLine/' \
  | uniq -c \
  | sed -n 's/CountThisLine//p' \
  | nl -nln
1             2 
2             1 
3             1 
4             5 
5             1 

관련 정보