- 締切済み
awkで複数ファイルのある列を抽出し出力したい
awkプログラミングの初心者です。 今、複数ファイル(1000ファイル)から、それぞれある列(すべて同じ列番号)のデータを抜き出して、1つのファイルに出力したいと考えています。 具体的には、1列目に共通項、2列目以降に1000ファイル分の抽出された列を、合計1001列となるような1つのファイルとして出力したいと考えております。 awkを使って出力するには、どのようなスクリプトを作ればよいか教えていただけませんでしょうか。 <イメージ> 元となるファイル(例えば下記のように3ファイル、実際には1000ファイル)があります。 file1.txt: 1 10 2 15 3 17 : : 1000 25 file2.txt: 1 5 2 40 3 22 : : 1000 17 file3.txt: 1 9 2 20 3 16 : : 1000 32 出力後のファイルイメージ: 1 10 5 9 2 15 40 20 3 17 22 16 : : : : 1000 25 17 32 ちなみに、自分で作成したawkスクリプト(下記)では、上記出力後のイメージとは異なり、 縦にデータが結合されてしまいました。 awk `{print $2}` ./file*.txt > Output.txt 出力後のファイル: 10 15 17 : 25 5 40 :
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- h271015
- ベストアンサー率71% (62/87)
"awk `{print $2}` ./file*.txt" では全てのファイル(file*.txt)の$2行目の内容が、順番に出力されるだけですので、横には結合されません。 ファイルを横に結合して出力できるpasteコマンドを利用するなどして実現できるかも知れません。 もっと良い記述の仕方があるかも知れませんが、たとえば、以下のようなシェルスクリプトです。 ============================================== #!/bin/bash ### awkでfile1.txtの一行目を取得して保存 awk '{print $1}' ./file1.txt > ./file0.tmp ### 各ファイルの2行目を取得して一旦$f.tmpというファイルに書き出す ### (処理をファイル数分繰り返す) for f in file*.txt ; do awk '{print $2}' $f > $f.tmp done ### paste コマンドで結合 paste *.tmp > Output.txt ============================================== ※下記はあくまでサンプルですので、動作確認等、自己責任で実施お願いいたします。 ※ファイル名や一時ファイル出力先・削除などは環境に応じて変更してください。
- trapezium
- ベストアンサー率62% (276/442)
元ファイルの区切り文字が全角空白になってますが、半角空白かタブ文字と想定して awk '{a[$1]=a[$1] OFS $2} END{for (i in a)print i a[i]}' file* | sort -n : : : : 1 10 5 9 2 15 40 20 3 17 22 16 1000 25 17 32 本当に全角空白なら適切に -F 指定してください。 それとワイルドカードの指示方法に注意が必要です。1から1000迄のファイル名が file0001からfile1000 となっていないと、想定する順序にならないので padding されてない場合は file?.txt file??.txt file???.txt file????.txt と順序良く指定する必要があります。
お礼
ありがとうございました。
- いけだ ひろし(@ike-2000)
- ベストアンサー率53% (69/129)
ファイルのデータは正しいものとし、a.awkスクリプトでは数のチェックは行っていません。 awk -f a.awk ./file*.txt > Output.txt awkスクリプト:a.awk BEGIN { fn="" max=0 } { if (FILENAME!=fn) { max++ cnt=1 fn=FILENAME } if (max==1) ARY[cnt]="" cnt ARY[cnt]=ARY[cnt] "\t" $2 cnt++ } END { for (cnt=1;cnt<=max;cnt++) { print ARY[cnt] } }
お礼
ありがとうございました。
お礼
ありがとうございました。