다음 파일이 있습니다.
$ 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
하지만 awk
Martin이나 SP ASIC에서 제공하는 더 명확한 접근 방식을 선호할 수도 있습니다.