- ベストアンサー
awkで改行を除いて文字列を抜きだす
こんにちは。 UNIXユーザーです。 awkでテキストファイルから行、列を指定して、文字列を抜き出し、それをシェルで変数として定義したいのですが、各行の最終列(最も右の列です)を指定すると、抜き出した文字列の末尾に’^M’がついてしまいます。 これが改行を意味するということは分かったのですが、これを取り除くためにはどうしたらよいでしょうか?? どなた様かご教授ください。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
改行文字、というか 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に繋いでもいいです
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
複数行にわたるデータでないなら組み込み変数 RSの内容を \r\n にするとか。 awk -vRS='\r\n' 'スクリプト' ファイル… BEGIN節でやってもいいですけど。
お礼
ありがとうございます. 残念ながら複数行にわたるデータなのです… BEGIN節というのも存じ上げないので,調べてみますね.
- Tacosan
- ベストアンサー率23% (3656/15482)
やりたい人がいるとは思えませんが, エディタでもできますな. vi でも emacs でも可.
お礼
ありがとうございます. 処理しなくてはならないファイルが大量にあるので,その方法は最後に取っておきたいところです.
- notnot
- ベストアンサー率47% (4900/10361)
gawk '{print sub("\r","",$NF)}'
お礼
ありがとうございます. 確かに^Mは消せるのですが,うまく値を読み取れなくなってしまいました…
お礼
丁寧な回答ありがとうございます. UNIX上でテキストファイルを見ると文字化けしているところがあったのはそういう理由だったのですね. 変換したところうまくいきました. ありがとうございます.