分解して解読したいコードがあります。各段階で何が起こるかを案内してくれる人が必要です。
FNR==NR {
if (split($1,a, "_") ==3)
f1[$1]
next
}
NF{
if (split($1, a, "_") ==3 && $1 in f1)
p=1
rec=(!rec)?$0:rec ORS $0
next
}
p{
print rec ORS
p=0; rec=""
}
答え1
NR
処理されたレコードの総数(現在処理中のレコードを含む)は、FNR
処理されたレコードの数です。現在のファイルに。これは最初のファイルでのみ発生します。
FNR==NR {
if (split($1,a, "_") ==3)
f1[$1]
next
}
今回もNF
現在のレコードのフィールド数です。空行の場合、値はゼロで、これは「false」(「true」とは逆)なので、ブロックは空でない行に対してのみ実行されます。このブロックの値を設定するコードを書き留めますp
。これは後で重要です。 ORS
出力レコード区切り記号。これは、記録されたときに各レコードがどのように異なるかです。デフォルトは改行です。これはrec
変数の値として条件付きで使用されます。
NF{
if (split($1, a, "_") ==3 && $1 in f1)
p=1
rec=(!rec)?$0:rec ORS $0
next
}
p
最後のブロックは、値が「true」の場合にのみ実行されます。
p{
print rec ORS
p=0; rec=""
}