2016-03-18 21 views
1

これは私自身の学習のためのものですが、awkコマンドを実行する前に-の前に$5を分割する必要があるinputというファイルがあります。基本的には、一致するすべての$5文字列を$3-$2で合計して、行と合計を出力しますが、分割なしではすべて同じです。私は前にファイルを分割することができますが、私は1つですべてを行うことができますか不思議ですawk。 commanddは、awkが実行される前に分割されている場合、ファイルに対して機能します。ありがとうございました :)。awkはコマンドを分割して実行します

入力

chr1  955543 955763 chr1:955543-955763 AGRN-6|gc=75 
chr1 957571 957852 chr1:957571-957852 AGRN-7|gc=61.2 

AWK

awk '{split($5,a,"-"); a[1]} {c1[$a1]++; c2[$a1]+=($3-$2)} 
END{for (e in c1) print e, c1[e], c2[e]}' input > out 

(分割なし)**電流出力**

AGRN-6 220 
AGRN-7 281 

所望の出力

AGRN 2 501 
+1

問題の説明を解析できません。何が起こると思いますか? – dovetalk

+0

'ARGN'の' $ 3- $ 2'と 'ARGN'のカウントが出力されます。しかし、 'ARGN'を非ユニークにする' input'の '$ 5'の' split 'がなければ、カウントは動作しません。これは役に立ちますか?ありがとうございました :)。 – Chris

+1

通常は、a)入力の例(完了)b)期待される出力(欠落)とc)これまでの試み(完了)を投稿することは良い考えです。追加b) – hek2mgl

答えて

2

私はあなたのスクリプトで参照唯一の問題はc1[$a1]c2[$a1]への参照です。ドル記号は文字列のインジケータではないことを忘れないでください。セレクタや配列のインデックスが行のフィールドの位置であると考えるべきです。

したがって、$a1は、可変可能な値a1の値ではなく、a1変数のフィールドの値です。デモを行うには:

$ echo "one two three" | awk '{ n=2; print $n }' 

余分なドル記号を削除するだけでいいです。

ちなみに、I は、誤ったスクリプトを実行したときと同じ出力を得ません。代わりにエラーが表示されます。

awk: illegal field $(), name "a1" 
input record number 1, file inp1 
source line number 1 

私はBSD awkを使用しています。私私はあなたのスクリプトをGNU awk(gawk)で実行するとエラーが発生します。あなたがたくさんのawkプログラミングをしているのであれば、別のawkか2つを選んでコードがどのように解析されているかを知ることができます。

+1

GNUシステムでは、これは 'echo'の無用な使用だと主張しますが、私はあなたがBSDの人であることを知っています..一口...;) – hek2mgl

+2

Heh、yep。私はほとんどの場合それを認めませんが、私はインタラクティブシェルとしてtcshを使います。 :-D – ghoti

関連する問題