2017-12-03 12 views
0

を組み合わせて、私はこれらの2つのコマンドを組み合わせたい:AWKスクリプトファイル:2つのコマンド

COMMAND 1:

`BEGIN { 
    ip = ARGV[2] 
    split(ip, octets, ".") 
    for (i = 1; i <= 4; i++) { 
     dec += octets[i] * 256 ** (4 - i) 
    } 
    printf("%i\n", dec) 
}` 

COMMAND 2:読むために

`BEGIN{ 
    FS=","; 
} 
{ 
    if ($4 == dec){ 
     print $7; 
    } 
} 
END { 
    print "END"; 
}` 

FILE:

"16777216","16777471","apnic","1313020800","AU","AUS","Australia" 
"16777472","16777727","apnic","1302739200","CN","CHN","China" 
"16777728","16778239","apnic","1302739200","CN","CHN","China" 
"16778240","16779263","apnic","1302566400","AU","AUS","Australia" 
"16779264","16781311","apnic","1302566400","CN","CHN","China" 

最初のcom mandはIPV4アドレスを10進数に変換するために使用され、2番目のアドレスは.csvファイルの10進数を検索するために使用されます。

したがって、私は次のようなコマンドを使用したい1次 awk -f script.awk fileToRead.csv 10101100.00010000.11111110.00000001

+0

サンプル入力を投稿しましたが、指定した入力と指定したコマンドで期待される出力を追加するのを忘れました。 –

答えて

1

ちょうど約あなたがやりたいだろう、あなたの2つのファイルを連結(ザッピング後ARGV [2]それはファイルとして扱われていません) :

BEGIN { 
    ip = ARGV[2] 
    split(ip, octets, ".") 
    for (i = 1; i <= 4; i++) { 
     dec += octets[i] * 256 ** (4 - i) 
    } 
    ARGV[2] = "" 
    ARGC-- 
} 

BEGIN{ 
    FS=","; 
} 
{ 
    if ($4 == dec){ 
     print $7; 
    } 
} 
END { 
    print "END"; 
} 

が、私はあなたのようにそれを書き換えお勧めします:

BEGIN { 
    split(ip, octets, /[.]/) 
    for (i = 1; i <= 4; i++) { 
     dec += octets[i] * 256 ** (4 - i) 
    } 
    FS="," 
} 
$4 == dec { 
    print $7 
} 
END { 
    print "END" 
} 

、その後、としてそれを呼び出す:

awk -v 10101100.00010000.11111110.00000001 -f script.awk fileToRead.csv 

ちょっと整理してください。

+1

ありがとうございます!それはまさに私が必要なものです。 ARGVをきれいに整えることができるかどうかはわかりませんでした。 :) – titi157

+0

まあ...あなたはちょっとしたことができますが、実際にはできません。私は、あなたがそれを削除することができますまたはnullに設定し、スクリプトの本文は、それをスキップしますが、ENDセクションでARGVを介してループした場合はまだそこにヌル文字列のエントリがあると思います。 'END'セクション全体をそのまま残すことができるのは分かっていますか?あなたはそれを持っていなければならないと思ったので、何かを印刷しているのかどうか分かりません。もちろん、BEGINのために、しかしあなたは実際にそれを使用しています。 –

関連する問題