awk 다중 패턴 일치 및 한 줄 인쇄

awk 다중 패턴 일치 및 한 줄 인쇄

다음 파일이 있습니다.

$ cat disk.out
disk0
fcs0
text
text
text
disk1
fcs1
text
text
text
text
...

내가 달성하고 싶은 것은 "disk" + "fcs"를 일치시킨 다음 이 쌍을 다음과 같이 한 줄로 인쇄하는 것입니다.

disk0,fcs0
disk1,fcs1
...

그래서 "disk"와 "fcs"를 일치시키고 awk출력 레코드 구분 기호를 ","로 변경했습니다. `

$ awk '/disk|fcs/' ORS="," disk.out
disk0,fcs0,disk1,fcs1,

문제는 모든 일치 항목을 한 줄에 인쇄하고 그 뒤에 오는 항목을 인쇄한다는 것입니다 ,. 각 일치 항목을 한 줄에 어떻게 인쇄합니까? 이와 같이:

disk0,fcs0
disk1,fcs1
...

답변1

다음 "fcs" 줄을 찾을 때까지 "disk" 줄을 인쇄하지 않고 저장해야 합니다.

awk '/disk/{ DISK=$0; next } /fcs/{ print DISK "," $0 }'

귀하의 방법의 문제점은 그것이 인쇄된다는 것입니다누구나"disk" 또는 "fcs"와 일치하는 행은 다음과 같습니다.결합하다그 라인.

편집하다:sp asic 스크립트무시하기 때문에 더 강력합니다.

disk3
text
fcs3

이 경우 내 스크립트는 "disk3, fcs3"을 인쇄합니다.

답변2

$ awk '/fcs/ && a ~ /disk/ {print a","$0} {a=$0}' disk.out
disk0,fcs0
disk1,fcs1

string ~ /regexp/정규식(여기)이 주어진 문자열과 일치하는지 확인합니다. 이 경우 문자열은 disk변경 가능합니다. 여기에서는 두 가지 조건을 결합하기 위해 a연산자를 사용합니다 . 첫 번째 조건 과 두 번째 조건이 모두 참인 &&경우에만 인쇄가 수행됩니다 ./fcs/a ~ /disk/

답변3

항상 이 형식인 경우(디스크당 하나의 fcs, fcs는 항상 디스크 뒤에 옴) 다음 없이도 수행할 수 있습니다 awk.

grep -F -e disk -e fcs file | paste -d , - -

또는:

awk '(/disk/ && ORS=",") || (/fcs/ && ORS=RS)' file

하지만 awkMartin이나 SP ASIC에서 제공하는 더 명확한 접근 방식을 선호할 수도 있습니다.

관련 정보