txtファイル内容を変数とした繰り返し処理でawkを行いたい
環境はWindows Ubuntu ver.18.04.2 Linuxです。Linuxに触れて数日の初心者です。
下記の冗長なbashスクリプトを実装しました。
本来実装したいことは、
(1)awk内で繰り返し処理をするとき、別途ファイルを参照すること。
(2)awkで繰り返し処理をするとき、出力を再度入力にすること。です。
具体的に処理した下記コード欄を参考に概要は、
入力はタブ区切りtxtで、あるフィールド(f2)に情報が詰め込まれています。
ループ処理で別途切り出し用txtの列内容(1列目)を変数にしてawkのmatchで文字列の抜き取り、組み込み関数 (RSTART, RLENGTH)でf2の単語を入力ファイルの最後列(f101)に付け加え、タブ区切りtxtで出力(out.txt)する。
出力したtxtをmvでinput.txtに変更後awkの再入力とし、別途切り出し用txtの内容(2列目)でループ処理を続ける、というものです。
以下に例として、入力ファイル、別途切り出し用txtファイル、bashコードを示します。
使用するファイル(例)
#入力ファイルinput.txt(タブ区切りtxt) f1 f2 ... f100 1 aaa=1.0;bbb=0.500;ccc=0.200 ... def 2 aaa=0.800;bbb=0.750;ccc=0.800 ... ghi 3 ... jkl … 100 aaa=0.004;bbb=0.000;ccc=0.008 ... xxx #別途切り出し用ファイルregex.txt (スペース区切りtxt) r1 regex1 val1 val2 r2 regex2 val3 val4 r3 regex3 val5 val6 … r10 regex10 valX valY
実装済の冗長ソースコード
awkの外側の外部ファイル参照によるwhile read文で繰り返し処理を行っている。
bash
1while read key regex val1 val2 ; do 2 cat ./input.txt | awk ' 3 BEGIN{ 4 FS = "\t" 5 OFS = "\t" 6 } 7 NR==1{$0,'"$key"'} 8 NR>1{ 9 if(match($2, /'"$regex"'/)){ 10 print $0,substr($2, RSTART + '"$val1"', RLENGTH - '"$val2"') 11 }else{print $0,"0"} 12 } 13 '>./out.txt #同名の./input.txtだと処理がうまくいかない(空白のテキストができる) 14 mv ./out.txt ./input.txt #処理に時間がかかるがout.txtとして1度出力し、mvで名前を変更した。 15done < ./regex.txt
実装したいこと
awkの中で別途切り出し用txtを変数に入れ繰り返し処理をする。そうすることで、下記のawk再入力問題は解決できる?気がするため。
もしくはawkの外側のwhile leadで繰り返しながら、awkの出力をそのまま再入力にする。
awkでできないなら、触れたことがありませんがperl等でも構いません。
回答4件
あなたの回答
tips
プレビュー