2017-07-17 5 views
1

私は次のawkファイルを持っています。前の行を記憶しているawkの問題

BEGIN { FS=":" }; 
{if (NR%2==1) { host=$1 }}; 
{if (NR%2==0) { print $host ":" $0 }}; 

私は次のことを行います。

行番号が奇数の場合は、1番目のフィールドを格納します。

行番号が偶数の場合は、以前に格納されたフィールド、コロン、および現在の行を印刷します。

現在、これは二回、偶数番目の行を出力「evenlineを:evenline」

ない私が間違ってやっていることを確認。

答えて

3

それは次のようになります。

BEGIN { FS=":" }; 
{if (NR%2==1) { host=$1 }}; 
{if (NR%2==0) { print host ":" $0 }}; 

$host - >host


なぜですか?

awkのフィールド名は、ドルで始まり、$で始まります。 awkのフィールドには、$1$2などのように静的にアクセスするか、$variableのように動的にアクセスできます。 awkのフィールド名は数値なので、フィールド名に使用すると、変数は整数にキャストされます。変数hostには、0にキャストされる文字列が含まれています。これにより、awkプリント$0が2回表示されます。あなたがこれを簡素化することができ


注:

BEGIN { FS=":" } 
NR%2==1 { host=$1 }; 
NR%2==0 { print host ":" $0 } 
+0

ああ、FFS ありがとうございました!! – Radamand

+0

ようこそ。説明が追加されました。 – hek2mgl

+1

[はっきり言って] 'BEGIN {FS =": "};と書くこともできます。 NR%2 {printf "%s:"、$ 1;次}; 1' –

関連する問題