デフォルトでは、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(csv形式、最初の行のヘッダー)を取得したいと思います。
CaseNum$Department$Topic
ZX56734562$56$ER
RF34678432$$TYG
sedの使い方を知っていますが、awkを使いたいです。また、私のコードの構造(1つの圧縮コードの代わりに数行、BEGINおよびENDブロック、「Blabla」で誤ったフィールドを見つけるのを防ぐための2つのパターンフィルタ)を維持したいと思います。
よろしくお願いします。
答え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$