複数の空白を一つのタブに変換する方法

このQ&Aのポイント
  • 質問文章の内容は、perlやawkを使用して複数の空白を一つのタブに変換する方法についてのものです。
  • 具体的には、与えられたファイルの各行の先頭からの空白を一つのタブに変換したいです。
  • この変換は、perlやawkの正規表現を使って簡単に実現できます。
回答を見る
  • ベストアンサー

複数の空白を一つのタブに変換したいです。awk?perl?

複数の空白を一つのタブに変換したいです。awk?perl? 以下、 空白を* タブを→で表します。 以下のような内容のファイルがあります。 ******1.00*171.587600 ******2.00*169.399074 ******3.00*175.825399 ******4.00*172.346719 … ***4998.00*165.252400 ***4999.00*166.219166 ***5000.00*166.581150 (場合によっては数万行になります) これを →1.00→171.587600 →2.00→169.399074 →3.00→175.825399 →4.00→172.346719 … →4998.00→165.252400 →4999.00→166.219166 →5000.00→166.581150 ないしは 1.00→171.587600 2.00→169.399074 3.00→175.825399 4.00→172.346719 … 4998.00→165.252400 4999.00→166.219166 5000.00→166.581150 という形に変えたいです。 恐らくperlやawkを用いて出来ると思うのですが、どうすればよいのかわかりませんので教えていただけるとありがたいです。

  • mdsba
  • お礼率59% (44/74)

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.3

>下のコマンドでは、 下のコマンドの s/ の後は空白2つです。そのままコピペしてもらえば良かったんですが。

mdsba
質問者

お礼

遅くなってすみません。 ありがとうございます。おっしゃる通りにしたらできました。 少し言い訳をさせていただくと、教えて!gooでは、投稿複数の空白を一つの空白にまとめてしまうことがあるように感じます。 しかしこちらの状況も的確に理解していただいて、なおかつ正しいコマンドを教えていただけるとは、ただただ感服しております。

その他の回答 (2)

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

一番単純なコマンドでは、 tr -s ' ' '\t' <infile >outfile ですね。あるいは、 sed 's/ */\t/g' infile >outfile

mdsba
質問者

お礼

上のコマンドで解決しました。 下のコマンドでは、 →1→.→0→0→1→7→1→.→5→8→7→6→0→0 といった感じになりました。 ありがとうございました。

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

Perl なら perl -pe 's/\s+/\t/g' \ は重ねる必要があるかもしれないしないかもしれない.

mdsba
質問者

お礼

ありがとうございました。 よく考えてみると、私、perlの使い方よくわかっておりませんで、生かすことができませんでした。 しっかりと勉強します。

関連するQ&A

  • sed、awk、または perl:行末判定

    htmlファイルの整形を考えています。 行末が必ず">"で終るように整形したいと思っています。 具体的にやりたいことは、awk または sed で、 ">"で終っていない行は次の行と連結し、それが">"で終ればその段階で出力、 それでも">"で終らなければまたその次の行を連結し... という作業をしたいのですが、その様なことができるでしょうか? 1行ごとに対する処理にはある程度なれているのですが、行に渡る作業には不馴れです。 良い方法がありましたら、ご教授頂けると幸です。 また、私はperlを知らないのですが、 もし「perlならこう書けば言い」ということが分る方がおりましたら、 その場合もご教授いただけたら嬉しく思います。 よろしくお願いします。

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

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

  • [awk]でデータ整理がしたいです。

    こんばんは この度、研究で膨大なデータをまとめたいのでawkを使おうと思っています。 元のファイルは約1万個あります。 ファイル名は R150km‐1020010001.txt から R150km‐1021800180.txt まであります。 102までは共通でそのあとの数字が変わります。 0010001...0010180 0020001 0020002...0020180.................1800180 といった形です。 中身は、 0 0 0 34 57 69 79 109 ....... といったように1行で8000列の数値データが入っています。 このファイルを下記のように1行目に0010001のファイルの中身、tabで区切って、2行目に0010002のファイルの中身といった形で一つのtxtにまとめたいです。 0 (tab) 0 (tab) 0 ... 34(tab) 28(tab) 36... 57(tab) 67(tab) 53... 69(tab) 78(tab) 72... 79(tab) 89(tab) 88... 109(tab) 99(tab)107 ... ... .... ... 可能でしょうか?ご回答お待ちしております。 よろしくお願いします。 awk初心者なので何か足りないところあったらすみません。

  • シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのです

    シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのですが、どうしたらいいでしょうか? 例えば、以下のようなtest.shというファイルを作ったとします。 --------------- #!/bin/sh AAA="x y" echo "" | awk '{print $AAA}' -------------- としたとき、$AAAが正常に出力できません。(なお、echo "" は、awkを走らせる為の単なるダミーです。) printの部分を ・awk '{print '$AAA'}' ・awk '{print "'$AAA'"}' などともしてみましたが、ダメでした。どのようにすればうまくいくでしょうか?

  • awkでの複数のファイルへの出力

    awkで、1つのファイルから複数のファイルを作りたいのですが、どのような命令を書く必要があるでしょうか。 具体的には、1行ごとに整形したものを別ファイルに保存されるようにしたいのです。BASICのように、ファイルのオープン、クローズの命令があるのでしょうか? awkはgawk32+おーくの友達v094bで使っています。テキストの遊園地(http://homepage2.nifty.com/mozu/koza/park_of_text.html)がとてもわかりやすく書いてあるので、ここでawkを勉強しているのですが、リファレンス的なものも欲しいので、わかりやすいリファレンスになっているサイトやファイル(申しわけありませんが、日本語になっているもので)があれば、そちらの紹介もお願いいたします。

  • awkの使い方について教えてください。

    awkとperlなどの初心者です。 使い方が分かっていないのですが、 例えば出力のフィールドセパレータを,に変更するには どうすればいいでしょうか? awk '{OFS=,;print}' fileなどとやってみますが、 うまくいきません。2つ以上のコマンドを実行するときの 文法がわかっていないような気がするのですが。 あとperlでよくみかけるperl -neのnは何でしょうか? man perlとやってみても-wと-eの意味しかのっていなくて なからないのですが。ご教授下さい。

  • Perlで空白行を削除

    現在、Perlにて外部のcsvファイルを読み込み、"重複行"と"空白行"を削除するプログラムを作成しています。 重複行を削除する部分は ------ open(IN, "csvtime.csv"); @data = <IN>; close(IN); @data = grep {!$count{$_}++} @data; open(OUT, "> csvtime.csv"); print(OUT @data); close(OUT); ------ でできたのですが、空白行を削除する部分がわかりません。 申し訳ないのですが、お教えいただけないでしょうか。 また、空白行で最初の空白行は残すようにしたいです。 よろしくお願いいたします。 例) 読み出しデータ ----- (ヘッダ1行目) (ヘッダ2行目) (ヘッダ3行目) (必要な空白) (ヘッダ4行目) 00:00:00,302 00:01:00,274 00:02:00,272 00:03:00,248 00:04:00,237 00:05:00,239 00:05:00,239 00:06:00,256 00:07:00,260 00:08:00,250 00:09:00,253 00:10:00,241 ----- 加工後データ ----- (ヘッダ1行目) (ヘッダ2行目) (ヘッダ3行目) (必要な空白) (ヘッダ4行目) 00:00:00,302 00:01:00,274 00:02:00,272 00:03:00,248 00:04:00,237 00:05:00,239 00:06:00,256 00:07:00,260 00:08:00,250 00:09:00,253 00:10:00,241 -----

    • ベストアンサー
    • Perl
  • awkで複数ファイルを入力した場合を教えてください。

    man awkとしたとき引数がfile...となっていたので 複数のファイルを引数にとれるのかなと思ったのですが その場合$1などフィールドを参照するときはどうなるのでしょうか?

  • awkのBEGINについて

    awkのBIGIN内で、データファイルの途中のレコード情報を取得することは可能でしょうか? 以下が行いたい詳細です。 下記例のテキストファイルの”DATE”行をawkスクリプトファイルのBEGIN内で取得したい。 例:test.txt 11111 22222 33333 DATE=20040706 44444 よろしくお願いいたします。

  • UNIX:テキストファイルのNULLを空白に変換したい。

    お世話になります。 現在テキストファイルをOracleデータベースに取り込む処理を開発しております。SQL*Loaderを用いて、テスト.datを取り込もうとしたのですが、 ORA-01722: 数値が無効です。エラーが出てデータを取り込めません。 テスト.datの中身を見たところ、該当個所に下記のようにNULLが入っていました。 数値型のテーブル項目に、NULLを取り込もうとしてエラーになっています。 Oracleの場合、数値型では空白は取り込めるようですが、NULLは取り込めないようです。 ですので、テスト.datのNULLの個所を空白に変換する方法を調査しています。 sedや、awk、perlを使えばできるのでしょうが、私は詳しくないため 方法が思いつきません。 どなたか、sed、awk、perlに詳しい方がいれば、方向性のヒントだけでも お教えねがいますでしょうか。 環境: Solaris 9 ■テスト.dat od -c テスト.dat > テスト.txt ※ \t = タブ、\0= NULL $ head -10 テスト.txt 0000000 0 0 1 \t 0 1 0 1 \t 1 \t 0 1 0 1 \t 0000020 0 0 0 0 0 0 \t 0 3 7 \t 1 0 0 1 0 0000040 2 8 \t \0 \0 \0 \t \0 \0 \0 \0 \0 \0 \0 \0 \0 0000060 \0 \t \0 \t 0 0 \t 6 3 \t 0 0 \t 1 \t ■編集後のイメージ \0(NULL)の個所を、そのままスペース(空白)で置き換えたい。 0000000 0 0 1 \t 0 1 0 1 \t 1 \t 0 1 0 1 \t 0000020 0 0 0 0 0 0 \t 0 3 7 \t 1 0 0 1 0 0000040 2 8 \t   \t 0000060 \t \t 0 0 \t 6 3 \t 0 0 \t 1 \t よろしくお願いします。