2016-04-19 2 views
1

私は選択したファイルの3列の最大値を取得するスクリプトを持っています。ファイルが純粋なら、それはうまくいきますが、tail + 2でファイルをパイプしようとすると、もう動作しません。awkスクリプトは純粋なファイルで動作しますが、tail + 2で動作しません。

BEGIN {max1 = 0; max2 = 0; max3 = 0} 
{ 
if(max1 < $1) 
max1 = $1 
if(max2 < $2) 
max2 = $2 
if(max3 < $3) 
max3 = $3 
} 
END {print max1, max2, max3;} 

私はこのようなコードを実行します:コードはありawkの-f [codefilename] [TARGETFILE]

作品100%良い

私はこれが(前に最初の行を削除するようなコードを実行しますカウント):

awk -f [codefilename] [targetfile] |テール+2

失敗しました

ご協力いただきありがとうございます。あなたはtail+2の間のスペースを必要とするすべての

awk -f codefilename targetfile | tail+2 

まず:

+2

私はあなたがしたいと思う: 'tail +2 targetfile | awk -f codefilename' – andlrc

+0

ありがとうございました!私はまだこれでかなり緑色です:D –

+0

ファイル名を末尾に置くのは、awk ... <(tail +2 file) ' – karakfa

答えて

1

はあなたの例を考えてみましょう。私はあなたがしたいと思いますが、すべてが、targetfileから最初の行を取ると上のawkのコードを実行することです

awk -f codefilename targetfile > tmp1 
tail +2 tmp1 

:次に何が起こっていることは、その基本的に書き込みのようなので、awkコマンドからの出力は、尾にパイプされていることですその場合は、それは、あなたが必要です:

tail +2 targetfile | awk -f codefilename 

私の知る限りtail +Nは、すべてのディストリビューションでサポートされていない、あなたが代わりにsed -n '2,$p'ようなものが必要でしょう。誰かが明らかにできるなら、してください。

+0

私はSunOS 5.11を使用していますので、+ Nをサポートしています:D。情報をありがとう。p.sはいテールと+2の間の空白は構文ミスです。 –

+0

もちろん、 'tail + 2'はまったく必要ありません。awkは' NR> 1 {... code ...} 'という行を完全にスキップできます。 @PauliusMickus btwあなたの最大計算は一般的に間違っている - 最初の値が読み込まれたシードは、ゼロより大きい値があるとは仮定しないでください。 –

+0

@Ed Mordon氏は、これは正の数でのみ動作することに留意してください。 –

関連する問題