2012-03-20 9 views
4

問題を短くします。実際、私はこれよりはるかに長いデータを持っています。awk forループのインデックスを正規表現で使用する方法

私のようなファイルがあります:

aa, bb, cc, dd, ee, 4 
ff, gg, hh, ii, jj, 5 
kk, ll, mm, nn, oo, 3 
pp, qq, rr, ss, tt, 2 
uu, vv, ww, xx, yy, 5 
aa, bb, cc, dd, ee, 2 

は今、私は最後の列の同じ番号のそれぞれの行を選択し、新しいファイルにリダイレクトするためにはawkを使用したいが、これらの新しいファイルは、によって異なります最後の列の番号。例えば、 。 t2.txt、t3.txt、t4.txt、t5.txtはそれぞれ最後の数が2,3,4,5の行を保持します。

t2.txtで

:t3.txtで

pp, qq, rr, ss, tt, 2 
aa, bb, cc, dd, ee, 2 

t4.txtで
kk, ll, mm, nn, oo, 3 

:t5.txtで

aa, bb, cc, dd, ee, 4 

ff, gg, hh, ii, jj, 5 
uu, vv, ww, xx, yy, 5 
BEGIN {FS=","} 
     { 
     for (n=2; n<=5; n++) 
     if ($6 ~/\$n/) {print > "t\$n.txt"} 
     }  

しかし、私はちょうどそれを動作させる方法がわからない:は、私はこのようなものが必要と思います。

このbashファイルは、私が望むことをしますが、問題は、特定の番号の行を抽出するたびに、すべての行を読み込む必要があることです。ファイルの唯一の時刻をチェックし、すべての番号のファイルを抽出するにはどうすればよいですか?

#!/bin/bash 
for num in {2..5}; do  
gawk --assign FS="," "\$6 ~/${num}/" infile >> t${num}.txt 
done 

答えて

0

私は答えを得て、次のように動作します: しかし、これ以上の説明は歓迎されます。

BEGIN {FS=","} 
     { 
     for (n=1; n<=5; n++) 
     if ($6 ~/\$n/) {print > "new"$n".txt"} 
     } 
5

次のコマンドを試してみてください。

awk '{ print $0 > ("t" $NF ".txt") }' infile 

スペース文字にそれがデフォルトであるため、FSを変更する必要はありません。そして最後にNF変数でフィールドにアクセスできます。

NB:ファイル名の文字列連結を括弧で囲む必要があります。そうでないと、違法な構文でawkが混乱します。

+0

ファイル名の連結には括弧が必要です。そうしないと、awkは不正な構文のため混乱します。 – andrewdotnich

+0

@andrewdotnich:ありがとう。 'GNU Awk 4.0.0'では括弧なしで動作しましたが、以前のバージョンではそうではなかったかもしれないので、あなたの提案を受け入れました。 – Birei

+0

たぶんそれはうんざりなことです - 私は私のMac上で 'awk'のカップル版を試してみましたが、どちらも不平を言っています... – andrewdotnich

関連する問題