2016-08-31 4 views
1

forループ内のawkスクリプトを使用して、異なるヘッダーとフッターの間のすべての行を別のファイルに解析しようとしています。awk行がファイル内のヘッダーとフッター文字列の間にある

19-T00,,,,,,,,,,,,,,,, 
1557,WT,,,,,,,,,,,,,,, 
6,109-G->A,110-G->A,,,,,,,,,,,,,, 
3,183-G->A,,,,,,,,,,,,,,, 
19-T10,,,,,,,,,,,,,,,, 
642,WT,,,,,,,,,,,,,,, 
206,24->G,,,,,,,,,,,,,,, 
19-T21,,,,,,,,,,,,,,,, 
464,24->G,,,,,,,,,,,,,,, 
19-TSpl,,,,,,,,,,,,,,,, 
2219,24->G,,,,,,,,,,,,,,, 
20-T00,,,,,,,,,,,,,,,,,, 
... 
... 

上記の行のための私の目標はからすべての行を渡すために、次のようになります。例えば、私はこのようになりますサンプル名のヘッダ(compiled.csv)とのミスマッチのリストを使用してファイルを持っていますsample-19.csvというサンプル出力ファイルの19-T00から2219,24->G,,,,,,,,,,,,,,,までです。

サンプル名はすべてパターン[0-9][0-9]-T*を共有します。そして、これを最初に実行する私のアプローチは、20のサンプル名(つまり19,20,21 ...)の配列を作成することに基づいていました。次のループを実行しようとしていますが、出力ファイルは作成されますが空白です。

for i in {0,19} 
do a="$i" 
b=`echo $i+1 | bc` 
header="${array[$a]}-T"; footer="${array[$b]}-T" 
name=`echo $header | cut -d"-" -f1` 
awk -F, -v start="$header" -v finish="$footer" '/^start*/,/^finish*/' compiled.csv >"sample-"$name".csv" 
done 

私はワンライナーを使って手動でこれを行う場合は、次の awk '/^19-T*/,/^20-T*/' compiled.csv >sample-19.csvそれが正常に動作します。だから私は、渡す変数に問題があるかもしれないと思うが、私はそれを修正する方法を知らない。

awkを使用したヘッダーフッターアプローチについて他のスレッドが議論していることは知っていますが、私の構文にはいくつかの助けが必要だと思います。誰かが経験豊富な目の助けを借りているなら、それは非常に感謝しています。何かが明確でない場合は私に教えてください。

おかげで、

マット

答えて

0

必要なのはこのような何か(未テスト)である:あなたが二度とシェルループで処理したテキストを検討している場合は

awk ' 
/^[0-9][0-9]-T00,/ { 
    close(out) 
    out = "sample-" $0 
    sub(/-T00.*/,".csv",out) 
} 
{ print > out } 
' compiled.csv 

は読んでくださいwhy-is-using-a-shell-loop-to-process-text-considered-bad-practice最初

+0

おかげだろう。しかし、テキスト処理の初心者として、次の「T00」の前にコードのどの部分が出力されているのかを説明できると思いますか?そして、より良い処理へのリンクに感謝しています...常にここで改善しようとしています。 – Matt

+0

ようこそ。私が質問を理解しているかどうかわからない、 'print'がすべての行を出力しています。テキストを操作する方法を学ぶには、Arnold RobbinsのEffective Awk Programming、第4版を読んでください。 –

+1

気にしないで、私は座って、それを過度に複雑にすることなくもっと考えました。愚かな質問ですが、まだ助けてくれてありがとう。乾杯! – Matt

0

awk

awk --posix '/[0-9]{2}-T00/{split($0,a,"-"); name=a[1]} {print $0>"sample-"name".cas"}' file 

出力は、あなたの内容のための2つのファイル「サンプル・19.csv」と「サンプル-20.csv」このエドため

+0

出力リダイレクションの右側に括弧で囲まれていない式を持つ未定義の動作であるため、いくつかのawksで失敗します。それは、 '--posix'の使用のためにgawk特有です。だから、そのフラグを使用している点がidkなのです。あなたは、 '$ 0'を必要としません。 GNU以外のawkでは、入力ファイルが大きい場合に出力ファイルを変更する際に出力ファイルを閉じる必要があります。最初のregexpにマッチする文字列が行のどこにあれば失敗します。 –

関連する問題