awk를 사용하여 N 출력 뒤에 줄 삽입

awk를 사용하여 N 출력 뒤에 줄 삽입

많은 양의 데이터로 가득 찬 텍스트 파일이 있습니다. 특정 문자열이 포함된 행을 추출해야 합니다. 나는 다음을 사용하여 awk를 통해 이 작업을 수행했습니다.

awk '/pattern1|pattern2|pattern3/ {print;}' infile

그런 다음 세 번째 줄 뒤에 새 줄(\n)을 추가해야 합니다. 그래서 다음과 같아야합니다

pattern1
pattern2
pattern3
<new line>
pattern1...

첫 번째 명령을 다른 awk 문에 전달하여 이 작업을 수행할 수 있었습니다.

awk -F '\n' '/pattern1|pattern2|pattern3/ { print; }' infile | awk '{ if ((NR % 3) == 1) printf("\n"); print; }'

저는 이 작업을 수행하는 데 더 효율적인 방법이 있어야 한다고 생각하여 이 두 명령을 결합하는 방법을 찾기 시작했습니다. 나는 다음을 시도했다:

awk '/pattern1|pattern2|pattern3/ { if ((NR % 3) ==1 ) printf("\n"); print; }'

이것이 효과가 있을 것이라고 생각했지만 출력은 완전히 예측할 수 없습니다. 때로는 5개의 행이 2개의 그룹으로 그룹화되지만 3개가 아닌 그룹이 있는 경우도 있습니다.

구분 기호 문제가 있을 수 있다고 생각하여 -F 옵션을 사용하고 IFS를 설정해 보았으나 출력이 변경되지 않았습니다.

if 문과 패턴 매칭을 결합하려고 하면 뭔가 어리석은 짓을 하고 있는 것 같은데, 조합을 알 수 없습니다.

단일 awk 명령으로 달성하려는 작업이 가능합니까? 그렇다면 내가 어디서 잘못됐나요?

답변1

시도한 솔루션의 문제점은 awk가 NR적합하지 않다는 것입니다.입력하다레코드 수에 따라 줄 바꿈을 삽입하려고 합니다.산출기록.

나는 awk 자체가 그런 수를 유지한다고 생각하지 않지만 다음과 같은 작업을 수행할 수 있습니다.

awk '/pattern1|pattern2|pattern3/ {print; if (++onr%3 == 0) print ""; }' infile

여기서 새로운 변수를 정의합니다 onr(출력 레코드 수- 변수 이름은 임의적임) 원하는 텍스트를 일치/인쇄할 때마다 증가시킨 다음 다음을 확인하십시오.저것3으로 나누어지면 개행 문자가 인쇄됩니다.

답변2

내가 올바르게 이해하고 있습니까? 당신은 발명을 시도하고 있습니다.

awk '/pattern1|pattern2/ {print $1;} /pattern3/ {print $1 "\n"}' infile

관련 정보