为什么 awk 对于我放在两个模式之间的逗号显示“语法错误”?

为什么 awk 对于我放在两个模式之间的逗号显示“语法错误”?

我在默认安装了 GNU Awk 4.0.1 的 Linux(Mint on a USB key)下运行以下脚本。

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$

相关内容