![为什么 awk 对于我放在两个模式之间的逗号显示“语法错误”?](https://linux22.com/image/72117/%E4%B8%BA%E4%BB%80%E4%B9%88%20awk%20%E5%AF%B9%E4%BA%8E%E6%88%91%E6%94%BE%E5%9C%A8%E4%B8%A4%E4%B8%AA%E6%A8%A1%E5%BC%8F%E4%B9%8B%E9%97%B4%E7%9A%84%E9%80%97%E5%8F%B7%E6%98%BE%E7%A4%BA%E2%80%9C%E8%AF%AD%E6%B3%95%E9%94%99%E8%AF%AF%E2%80%9D%EF%BC%9F.png)
我在默认安装了 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$