• ベストアンサー

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% (4848/10262)
回答No.1

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

goo2dolls
質問者

お礼

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

関連するQ&A

  • awkで可変文字列をマッチング

    シェルなどでawkを使う際に、シェルの引数として渡された文字列をawkに渡し、それを条件にマッチングをかけたいのですが、どうしたら良いのでしょうか?(まあ、素直にgrepを使えばいいのですが・・・) 例えば、 cat foo.txt | awk '{if ($2 == ptn) print}' ptn=$<シェルの引数> とかやれば、2番目のフィールドに完全に一致する行が抽出できるのですが、 cat foo.txt | awk '/ptn/ {print}' ptn=$<シェルの引数> とかやっても、"ptn"という文字列をマッチングしてしまうので、うまくいきません。どの位置に出現するかわからないけど、シェルの引数で指定された文字列が含まれている行だけを出力したい場合、どうしたらよいのでしょう・・・。

  • UNIXで、とあるテキストに対して2文字区切りで改行をいれるには?

    UNIXのシェルスクリプトで、このような動作ができないものかどうか考えています。 あるテキストファイルの内容を、2文字ごとに区切って改行を入れるように加工する 例えば file1.txt が以下のような内容であれば --file1.txt-- 000092 027301 01 0263000001 2文字ずつ区切って改行を挿入したファイル --file2.txt-- 00 00 92 02 73 01 01 02 63 00 00 01 を生成したいと思います。 ここで元のファイルは必ず、半角の数字のみで構成されており、 1行の文字数は最低2文字以上あり、なおかつ奇数個の文字列は存在しないものとします。 awk や grep や sed を組みあわせて考えているのですが、 なかなか解決に至りません。 どなたかお知恵を拝借願います。

  • C# 文字列を改行コードで分割

    C# 文字列を改行コードで分割 テキストボックスに記載された文字列を1行ごとに取り出そうと思い string[] strs = textBox1.Text.Split('\n'); とコーディングしたら、末尾に\rがついてしまいました。 末尾の\rを削除するコードを追加して書けばよいのですが、改行コード\r\nで分割する方法ありましたらお教えください。

  • awk in csh

    cshスクリプトの中で、awkと連動させたプログラムを書こうとしています。 以下の様なテーブルファイル(hoge.txt)があると想定してください。 1 0.01 0.52 3.23 ..... 2 0.22 9.34 8.22 ..... 3 0.44 0.68 3.81 ..... ... (列も行も揃っている数値だけのテーブル) 例えば、変数hogeに第2行、第2列の数値(文字列)0.22を代入する際、 シェルスクリプト内部で、 @ hoge = `awk 'NR==2' {print $2} hoge.txt` としましたが、$2をスクリプトに与えられた2番目の引数だと解釈して、 うまく動作しません。 試しに$2 -> \$2に変換してみましたが、ダメでした。 (\の後に改行がないというエラーが出ました) 第i列目,j行目の文字列を取り出すにはどのようにすれば良いでしょうか。

  • awkについての質問

    実行環境:AIX5.2 シェル:Ksh 以下の2点をシェル内部で実行しているのですが、上手くいきません。 ご教授お願いいたします。 (1)System関数の実行結果(標準出力)をTERM上に表示させず、処理をしたい。 #!/usr/bin/ksh awk '{ system("ls -l") ###具体的にはls -l 結果の2行目、第一フィールドをawk内で変数に格納 }' (2)変数に格納された文字列のバイト数を取得し、変数に格納したい。 length()は文字数を取得できる事は理解したのですが、文字数ではなく、文字列のバイト数を取得したいです。awkに実装されている関数などありますでしょうか?

  • fputで出力した文字列を改行するには?

    PHP初心者です。 いくつかの文字列変数をテキストファイルに書き出す処理を行いたいのですが、うまく動作してくれません。 文字列変数 $str_a, $str_b, $str_cをカンマで区切ってテキスト1行でファイルに書き出しています。 $str = $str_a . ',' . $str_b . ',' . $str_c . '\\r\\n'; fputs($fp, $str); 上の2行がループで数回呼ばれた後、ファイルをクローズしているのですが、実際に作成されたテキストファイルを見ると a1,b1,c1\r\na2,b2,c2\r\n....みたいに改行が入らず"\r\n"という文字列があるだけです。希望しているのは a1,b1,c1 <-ここで改行 a2,b2,c2 <-ここも改行 という結果なのですが.... よろしくご教授お願いいたします。

    • ベストアンサー
    • PHP
  • delphiにて 文字列の最後の改行を取り除く

    S :=TStringList.Create; で読みこんだテキスト S.Textの文字列の末尾に一個もしくは複数個の改行#13#10があった場合に取り除きたいのですが、 その方法がいまいちよくわかりません。 ずばり方法、アドバイス、tipsのサイトなど、 教えていただけないでしょうか?

  • シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入

    こんにちは。 シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入したいと思います。 ・sample.txt (挿入前) -- <ABC> <ABC> Hello! </ABC> </ABC> -- ↓ ・sample.txt (挿入後) -- <ABC> <ABC> Hello! </ABC> Good Morning Good Evening </ABC> -- 上記のように、テキスト末尾から検索して、 はじめて表れた"</ABC>"のタグの前に、 Good Morning Good Evening という2行の文字列(無理なら1行でも)を追加したいと考えています。 "</ABC>"タグは2つありますが、末尾から検索して初めて表れたもののみ対象です。 このような操作を行うには、 どのようにシェルを組み合わせれば良いのでしょうか? grepやsedを用いて考えてはいますが、よく分かりません。 (grepで末尾から初めて表れた"</ABC>"の行番号を取得し、 その上に、sedで文字列を挿入するなどですが・・・よく分かりません) どなたか、よろしくお願いします。

  • シェルで文字列を置換したい。

    UNIXのシェルであるファイルに書かれている文字から ある文字列を置換してそのファイルの中身を書き換えたいのですが どう書いていいのかわかりません。 ファイルを読み込んで該当の文字列を含んだ行を 見つけるところまではいったのですが・・・。 どなたか教えてください! よろしくお願いします。

  • 文字列から特定の文字を抜き出す

    こんにちは。 シェルスクリプトで文字列から特定の文字を抜き出し、 変数に入れたいのですが、うまくいきません。 申し訳ありませんが、アドバイスをお願いいたします。 文字列 $moji=aaa_bbb_ccc (文字は変動します) $a=aaa $b=bbb $c=ccc と"_"毎に変数に代入したい。 echo $moji | awk -F_ '{print $2}' で文字を標準出力に取り出すことはできるのですが、 そこから変数に代入する方法がいまいち分かりません。

専門家に質問してみよう