- ベストアンサー
「awk」で複数のファイルの特定行を変換する方法
初心者です。 「awk」又は「perl」を使って a.txt、b.txt…z.txtの中の1行目10カラム目の値を 全て「a」という値に一括で変換する方法を教えて下さい。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
awkだけでは不可能ではないですが、わかりにくくなってawkの利点が失われるので、シェルと組み合わせるのがいいでしょう。 for f in [a-z].txt do awk 'NR==1{$0=substr($0,1,9)"a"substr($0,11)}{print}' $f > $f.out && mv $f.out $f done
その他の回答 (2)
- noboru2000
- ベストアンサー率33% (47/140)
perl -i.bak -pe 'if($NR==0){substr($_,9,1)="a"}' [a-z].txt これで a.txt ~ z.txt の1行めの10カラム目(0から数えると9カラム目)の文字が 'a' になります(但し最後の改行も含めて1行目が10文字に満たない行の場合はエラーになります)。変更前のファイルは .bak が付けられてバックアップされます。 尚、上記は Linux などのUNIX系OSでの一般的なシェルを使用した場合の書き方です。Windows の コマンドプロンプトなどではシングルクォートが使えないと思いますので適当に修正して下さい。
お礼
お礼が遅くなり申し訳ありません。 コメントまで付けていただいてありがとうございました。 大変参考になりました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#Perlでは、こんな感じで #充分テストしてから本番を実行されますように… foreach $file ("a".."z"){ if(open(IN, "$file.txt")){ @data=<IN>; close(IN); substr($data[0], 9, 1)="a";#1行目の10カラム目から1文字をaにする open(OUT, ">$file.txt"); print OUT @data; close(OUT); } }
お礼
お礼が遅くなり申し訳ありません。 大変参考になりました。 ありがとうございました。
お礼
お礼が遅くなり申し訳ありません。 awkの利点の意味がまだ理解できませんが、 参考になりました。 ありがとうございました。