2012-03-23 9 views
1

awkライナーを使用してthis質問から類似した問題を解決しました。しかし、本当にAwkを知らない私はそれがどのように動作するか分かりません。誰でもスクリプトの機能を説明できますか?私はそれを理解して、異なる状況でそれを適用できるようにしたいと思います。以下は Awk:別のファイルからの入力に基づいて列の値を代入する

は、リンクから1つのライナーです:

awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' f2 f1 

私はそれのFNR=NR一部は、ファイル1の行は、ファイル内の同じ行番号に一致していることを確認する何であることを知っている2、明らか$ 3と$ 2は、それぞれ第3フィールドと第2フィールドに対応しています。しかし、私はコードの最後にある "1"が何をしているのか困惑しています。私は少し "a"に混乱しています。私はそれがファイル名を表すと仮定します。

+0

'a'は配列変数の名前です。 '1'は' {print} 'の省略形です – potong

答えて

2

awkは、各ファイルを1行ずつ順番に処理します。 Awkは、現在のファイル内の現在の行番号(FNR変数)とこれまでに見られた行の総数(NR変数)を追跡します。 FNR==NRという条件は、awkが最初のファイルを読み込んでいる間のみ真となります。

a[NR]=$3は、3番目のフィールドの値を保持するようにNRでインデックスされた配列要素を設定します。

awkプログラムは主にcondition {action}個のペアで構成されています。現在の行については、各条件がチェックされ、真であればアクションブロックが実行されます。条件がない場合、アクションブロックが実行されます。これは{$2=a[FNR]}ブロックの場合です。条件が存在するがアクションブロックが存在しない場合、デフォルトアクションは変換後の現在の行である$ 0を出力することです。非ゼロの数値はtrueと等しいので、1はawkにすべての行に対してデフォルトのアクションを実行するよう指示します。

最初のファイルが印刷されない理由は、最初のブロックのnext命令によるものです。

+0

ありがとう!私は詳細な答えを感謝します。それは私のために物事をクリアします。 –

関連する問題