awk를 사용하여 두 개의 연속 라인을 일치하는 패턴과 비교하고 첫 번째 일치 라인을 삭제합니다.

awk를 사용하여 두 개의 연속 라인을 일치하는 패턴과 비교하고 첫 번째 일치 라인을 삭제합니다.

다음과 같은 파일이 있습니다.

apple 1
apple 2
mango 3
apple 2
mango 4
mango 5
apple 3
apple 4
cherry 6
cherry 7
cherry 8
apple 5
cherry 9

apple한 줄에 awk 또는 sed를 사용하여 두 번째 줄을 유지하는 패턴과 일치하는 연속 줄을 삭제하고 싶습니다 . 또한 패턴과 일치하지 않는 나머지 줄을 유지하고 다음과 같은 출력을 얻고 싶습니다.

apple 2
mango 3
apple 2
mango 4
mango 5
apple 4
cherry 6
cherry 7
cherry 8
apple 5
cherry 9

답변1

awk 스크립트에 대한 추가 최적화:

awk '$1=="apple"{l=$0;next}l{print l; l=""}1' file 

이는 l패턴과 일치하는 행을 변수에 저장하는 데 의존합니다 apple. 저장된 라인은 패턴을 찾을 수 없는 경우에만 인쇄됩니다.

답변2

몇 번의 시행착오 끝에 다음과 같은 답을 얻었습니다.

awk '{a=$1;b=$2;row1=NR;getline;row2=NR;c=$1;d=$2;if(row1==row2 || (a=="apple" && c=="apple")) {print c " " d;} else {print a " " b;print c " " d;}}' FILE

결과는 다음과 같습니다.

apple 2
mango 3
apple 2
mango 4
mango 5
apple 4
cherry 6
cherry 7
cherry 8
apple 5
cherry 9

관련 정보