• ベストアンサー

「awk」で複数のファイルの特定行を変換する方法

初心者です。 「awk」又は「perl」を使って a.txt、b.txt…z.txtの中の1行目10カラム目の値を 全て「a」という値に一括で変換する方法を教えて下さい。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.2

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

baul
質問者

お礼

お礼が遅くなり申し訳ありません。 awkの利点の意味がまだ理解できませんが、 参考になりました。 ありがとうございました。

その他の回答 (2)

回答No.3

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 の コマンドプロンプトなどではシングルクォートが使えないと思いますので適当に修正して下さい。

baul
質問者

お礼

お礼が遅くなり申し訳ありません。 コメントまで付けていただいてありがとうございました。 大変参考になりました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

#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); } }

baul
質問者

お礼

お礼が遅くなり申し訳ありません。 大変参考になりました。 ありがとうございました。

関連するQ&A