두 패턴 사이에 넣은 쉼표에 대해 awk가 "구문 오류"를 표시하는 이유는 무엇입니까?

두 패턴 사이에 넣은 쉼표에 대해 awk가 "구문 오류"를 표시하는 이유는 무엇입니까?

기본적으로 GNU Awk 4.0.1이 설치된 Linux(USB 키의 Mint)에서 다음 스크립트를 실행했습니다.

awk가 반환한 오류는 다음과 같습니다.

awk: cmd. line:7:               /^Observation/,/^@@@/ {sub("/^N° of case: \\(.*\\)$","\\1\\$"); print}
awk: cmd. line:7:                             ^ syntax error

스크립트는 다음과 같습니다(여기에서 제거한 일부 관련 없는 코드 줄을 "..."으로 대체).

#!/bin/bash

...

awk 'BEGIN \
    {
        FS = "@@@\n"; RS = "###-###\n"; OFS = "$"; ORS = "\n"; SUBSEP = ","
        printf("CaseNum$Department$Topic\n");
    }
    {
        # Body awk script
        /^Observation/,/^@@@/ {sub("/^N° of case: \\(.*\\)$","\\1\\$"); print}
        /^Observation/,/^@@@/ {sub("/^Department: \\(.*\\)$","\\1\\$"); print}
        /^Observation/,/^@@@/ {sub("/^Topic: \\(.*\\)$","\\1\\$"); print}
    }
    END \
    {
        #printf("Number of records processed : %d",NR);
    }' input.txt > out.csv

참고로, 스크립트에 의해 구문 분석된 input.txt 파일은 다음과 같습니다(여기서 "Blabla"는 무엇이든 될 수 있고 길이도 제한되지 않습니다).

...
Observation
Blabla
N° of case: ZX56734562
Blabla
Department: 56
Blabla
Topic: ER
Blabla
@@@
Blabla
@@@
Blabla
###-###
Observation
Blabla
N° of case: RF34678432
Blabla
Topic: TYG
Blabla
@@@
Blabla
...

일부 필드가 누락될 수 있지만 out.csv 파일은 생략된 필드를 포함한 모든 필드를 유지해야 합니다(예: 여기에서 두 번째 레코드의 "부서" 필드가 누락되고 out.csv 파일이 비어 있음).

다음 out.csv(csv 형식, 첫 번째 행의 헤더)를 가져오고 싶습니다.

CaseNum$Department$Topic
ZX56734562$56$ER
RF34678432$$TYG

sed 사용법을 알고 있는데 awk를 사용하고 싶습니다. 또한 내 코드의 구조(1개의 압축 코드 대신 몇 줄, BEGIN 및 END 블록, "Blabla"에서 잘못된 필드를 찾는 것을 방지하기 위한 두 개의 패턴 필터)를 유지하고 싶습니다.

미리 감사드립니다.

답변1

awk 'BEGIN {
        ...
     }
     # the next line should NOT be within curly braces
     $1 ~ /^Observation/, $1 ~ /^@@@/ { ... }
     {
        ...
     }
     END{
        ...
     }' input.txt > out.csv

답변2

달성하려는 목표가 정확히 무엇인지는 확실하지 않지만 요구 사항에 맞는 단순화된 버전은 다음과 같습니다.

awk '
BEGIN { ORS = "$" }
/^N° du cas:/,/^@@@/ {
    sub("N° du cas: ","\n")
    if($1!="@@@")
        print
}
{ next }
END {
    printf("\n")
    printf("Number of records processed : %d",NR)
}'

예제 입력에 따른 출력은 다음과 같습니다.

ZX56734562$Blabla$
RF34678432$Blabla$

관련 정보