1

動作させようとしているスクリプトに awk コマンドがありますが、「a」の意味がわかりません。

awk 'FNR==NR{ a[$1]=$0;next } ($2 in a)' FILELIST.TXT FILEIN.* > FILEOUT.*

私はコマンドラインを使用するのが初めてなので、物事を理解しようとしています、ありがとう。

4

3 に答える 3

6

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
于 2013-09-27T14:45:05.740 に答える
3

これはコマンドでaはありませんが、次のawk arrayようにすることもできますarr

awk 'FNR==NR {arr[$1]=$0;next} ($2 in arr)' FILELIST.TXT FILEIN.* > FILEOUT.*
于 2013-09-27T14:41:23.130 に答える
2

あなたのコードでは、 a は配列に他なりません

FNR==NR{ a[$1]=$0;next } 

最初の入力ファイルの最初の列から取得したインデックスを使用して、"a" という配列を作成します。すべての要素の値が現在のレコードに設定されます。

次のステートメントは、現在のレコードの処理を直ちに停止し、次のレコードに進むように awk に強制します。

于 2013-09-27T14:43:07.980 に答える