나는 이 파일을 가지고 있습니다 :
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]
-ne
perl
입력 파일을 한 줄씩 처리하고 주어진 스크립트를 각 줄에 적용하도록 지시합니다-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