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を使用したヘッダーフッターアプローチについて他のスレッドが議論していることは知っていますが、私の構文にはいくつかの助けが必要だと思います。誰かが経験豊富な目の助けを借りているなら、それは非常に感謝しています。何かが明確でない場合は私に教えてください。
おかげで、
マット
おかげだろう。しかし、テキスト処理の初心者として、次の「T00」の前にコードのどの部分が出力されているのかを説明できると思いますか?そして、より良い処理へのリンクに感謝しています...常にここで改善しようとしています。 – Matt
ようこそ。私が質問を理解しているかどうかわからない、 'print'がすべての行を出力しています。テキストを操作する方法を学ぶには、Arnold RobbinsのEffective Awk Programming、第4版を読んでください。 –
気にしないで、私は座って、それを過度に複雑にすることなくもっと考えました。愚かな質問ですが、まだ助けてくれてありがとう。乾杯! – Matt