• ベストアンサー

awkで改行を除いて文字列を抜きだす

こんにちは。 UNIXユーザーです。 awkでテキストファイルから行、列を指定して、文字列を抜き出し、それをシェルで変数として定義したいのですが、各行の最終列(最も右の列です)を指定すると、抜き出した文字列の末尾に’^M’がついてしまいます。 これが改行を意味するということは分かったのですが、これを取り除くためにはどうしたらよいでしょうか?? どなた様かご教授ください。 よろしくお願いいたします。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

改行文字、というか CR(ASCIIコード0x0d)ですね。 元のテキストファイルはWindowsで作成したものじゃないですか? Windowsではテキストの改行にCR+LF(0x0d 0x0a)の2バイトを使い、UnixではLF(0x0a)の1バイトを使っています。 なんの工夫もせずにWindows→Unixへファイルを転送すると、LFは改行となりますが、CRはそのまま「文字」として残ってしまします。awkでは1行単位でLFを除いた状態で処理するので、CRが残ってしまっている、ということです。 awkで取り除く方法は既出なので、別の手段としては ・Windows上でLFで保存する: そのテキストファイルを作成するソフトによっては可能です。 ・Unixへ転送時にテキストモードを使用する: ftpでは、これでCRが取り除かれます。バイナリーファイルでやってしまうと、ファイルが破壊されますので、バイナリーファイルはバイナリーモードで。 ・Unix上のツールでCRを取り除く: (インストールされているなら) dos2unixやnkfといったコマンドで改行コードの変換ができます。 そのままパイプでawkに繋いでもいいです

goo2dolls
質問者

お礼

丁寧な回答ありがとうございます. UNIX上でテキストファイルを見ると文字化けしているところがあったのはそういう理由だったのですね. 変換したところうまくいきました. ありがとうございます.

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

複数行にわたるデータでないなら組み込み変数 RSの内容を \r\n にするとか。 awk -vRS='\r\n' 'スクリプト' ファイル… BEGIN節でやってもいいですけど。

goo2dolls
質問者

お礼

ありがとうございます. 残念ながら複数行にわたるデータなのです… BEGIN節というのも存じ上げないので,調べてみますね.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

やりたい人がいるとは思えませんが, エディタでもできますな. vi でも emacs でも可.

goo2dolls
質問者

お礼

ありがとうございます. 処理しなくてはならないファイルが大量にあるので,その方法は最後に取っておきたいところです.

  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.1

gawk '{print sub("\r","",$NF)}'

goo2dolls
質問者

お礼

ありがとうございます. 確かに^Mは消せるのですが,うまく値を読み取れなくなってしまいました…

関連するQ&A