내 입력은 다음과 같습니다.
>gi|481443199|gb|MH447771.1|
49 0 0 0 1
50 0 0 1 0
>gi|987078004|gb|RTYJ01067061.1|
412 0 0 1 0
413 1 0 0 0
>gi|557075006|gb|ERTJ01078061.1|
41 0 0 1 0
41 1 0 0 0
>gi|787073002|gb|WERJ01045061.1|
612 0 0 1 0
613 1 0 0 0
>gi|887079001|gb|WERJ01045061.1|
715 0 0 1 0
716 1 0 0 0
일부 줄을 인쇄하고 싶지만 으로 시작하는 다른 모든 줄은 건너뛰고 >
그 이후의 모든 줄은 다음 줄까지 건너뜁니다 >
. 위 입력 예의 경우 출력은 다음과 같습니다.
>gi|481443199|gb|MH447771.1|
49 0 0 0 1
50 0 0 1 0
>gi|557075006|gb|ERTJ01078061.1|
41 0 0 1 0
41 1 0 0 0
>gi|887079001|gb|WERJ01045061.1|
715 0 0 1 0
716 1 0 0 0
어떻게 해야 하나요?
답변1
다른 모든 > ...
블록을 건너뛰려면:
awk '/^>/ { p = !p } p' input.txt
p
인쇄 플래그입니다. 기본 작업은 콘텐츠가 제공되지 않을 때 이므로 p
인쇄할 때 true를 나타냅니다 . 에서 변수는 빈 상태로 시작하고 부울 컨텍스트에서 false로 평가됩니다. 행에 도달할 때 마다 플래그가 전환됩니다.p
print
awk
> ...
p
n
각 블록을 줄로 구분하여 인쇄하려면 다음을 수행하세요 > ...
.
awk -v n=200 '/^>/ { if (skip == 0) skip = n - 1; else --skip; } skip == n - 1' input.txt
비슷한 논리입니다. n
2가 아니기 때문에 부울 플래그 대신 카운터를 사용해야 합니다. 여기에서는 skip
인쇄를 다시 시작하기 전에 건너뛸 줄 수를 계산합니다. > ...
나는 skip == n - 1
바로 가기로 인쇄 플래그로 사용합니다.
답변2
awk의 경우 다음과 같이 할 수 있습니다.
awk 'BEGIN{pr=true}/^>/{pr=!pr}{if (pr) {print}}'
이는 인쇄 시기를 나타내는 플래그(pr)를 설정하며, 토큰이 나타날 때마다 전환됩니다.
답변3
$ awk '/^>/{f=f?0:1;}f' file
"^"로 시작하는 줄이 나타나면 플래그 변수를 켜고 끄세요. 켜져 있으면 라인이 인쇄되고, 그렇지 않으면 인쇄되지 않습니다.
답변4
보다 일반적인 해결 방법은 다음을 시도해 볼 수 있습니다.
awk 'k%10==0{print} /^>/ {k++}' input.txt
k
줄이 다음으로 시작될 때마다 변수가 증가 >
하고 k 모듈로 10이 0이면 해당 줄이 인쇄됩니다. 따라서 두 번째 줄마다 인쇄하려면 , 200번째 줄마다 등 k%10==0
으로 변경하세요.k%2==0
k%200==0
경고: 이 버전에서는 첫 번째 줄이 항상 인쇄됩니다.