動作させようとしているスクリプトに awk コマンドがありますが、「a」の意味がわかりません。
awk 'FNR==NR{ a[$1]=$0;next } ($2 in a)' FILELIST.TXT FILEIN.* > FILEOUT.*
私はコマンドラインを使用するのが初めてなので、物事を理解しようとしています、ありがとう。
動作させようとしているスクリプトに awk コマンドがありますが、「a」の意味がわかりません。
awk 'FNR==NR{ a[$1]=$0;next } ($2 in a)' FILELIST.TXT FILEIN.* > FILEOUT.*
私はコマンドラインを使用するのが初めてなので、物事を理解しようとしています、ありがとう。
a
連想配列です。
a[$1] = $0;
行の最初の単語$1
を配列のインデックスとして取得し、行全体$0
を値として格納します。これは最初のファイルに対して行われます (ファイルのレコード番号は全体のレコード番号と同じです)。このnext
コマンドは、最初のファイルを処理している間、残りのスクリプトを処理しないことを意味します。
残りのデータ ファイルについては、次のように評価されます。
($2 in a)
in という単語$2
が見つかった場合は、その行を出力します。これは、ファイル全体のコピーを格納するため (ファイルの各行に単語が 1 つしかない場合はおそらく 2 回)、 への格納$0
に比較的コストがかかります。a
より慣習的で、a[$1]++
orを実行するだけで十分a[$1] = 1
です。
与えられた FILELIST.TXT
ABC The rest
DEF And more
以下を含む FILEIN.1 が与えられた場合:
Word ABC and so on
Grow FED won't be shown
This DEF will be shown
The XYZ will be missing
出力は次のようになります。
Word ABC and so on
This DEF will be shown
これはコマンドでa
はありませんが、次のawk array
ようにすることもできますarr
。
awk 'FNR==NR {arr[$1]=$0;next} ($2 in arr)' FILELIST.TXT FILEIN.* > FILEOUT.*
あなたのコードでは、 a は配列に他なりません
FNR==NR{ a[$1]=$0;next }
最初の入力ファイルの最初の列から取得したインデックスを使用して、"a" という配列を作成します。すべての要素の値が現在のレコードに設定されます。
次のステートメントは、現在のレコードの処理を直ちに停止し、次のレコードに進むように awk に強制します。