• ベストアンサー

awkのセパレータ指定について

awkのセパレータ指定について教えてください。 以下のようなファイルがありそれを'||'区切りで出力したいです。 下記のような指定をしてみたのですが、 うまくいきませんでした。 cat text | awk -F '||' '{print $1}' [test.txt] aaa||bbb||ccc [期待する結果] print $1 → aaa print $2 → bbb print $3 → ccc どなたか教えてください。 よろしくお願いします。

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

  • ベストアンサー
回答No.3

FS="||"はうまくいかないみたいですね。 FS="[|]+"ならOKみたいなので、 cat text.txt | awk -F'[|]+' '{print $1}' or cat text.txt | awk 'BEGIN{FS="[|]+"}{print $1}' で。

greenn777
質問者

お礼

回答ありがとうございます。 正規表現で行うのですね。 期待する動きとなりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

noname#190876
noname#190876
回答No.2

cat text | sed 's/\|\|/ /g | awk '{print $1, $2, $3}' でいけるけど。

greenn777
質問者

お礼

回答ありがとうございます。 sed で置換してawkで行っているのですね。 勉強になりました ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

具体的に何がどううまくいっていないのかわかりませんが.... とりあえず ・なぜ「cat text」なんだろう ・マニュアルは読んだ?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 今、awkを使ったシェルスクリプトを作っています。

    今、awkを使ったシェルスクリプトを作っています。 aaa bbb ccc ddd ee ff gggg hhh といったファイルから、 bbb,ccc ff,gggg を取り出したいと思っています。 そこで、以下のコマンドをwhileでまわして、$iを増加させることにより、 ファイルを一行ずつ読み取り、目的の列を取り出したく思っています。 A=`cat sample.txt|awk 'NR == $i {print NR, $2;}'` B=`cat sample.txt|awk 'NR == $i {print NR, $3;}'` ところが、awkコマンドの中の$iがシングルクォーテーションでくくられているので、 変数展開されなくて困っています。 何かよい方法があればご教授いただけますでしょうか?

  • unixのawkについて

    unixでawkを使ってフルパスからディレクトリとファイル名に分けようと しているのですが、上手くいきません。 例えば ①/aaa/bbb/ccc ②/111/222/333/hoge.txt ③/hoge/foo/bar/dk@0:1 を ①/aaa/bbb と ccc ②/111/222/333 と hoge.txt ③/hoge/foo/bar と dk@0:1 としたいのです。 echo "/111/222/333/hoge.txt" | gawk '{sub(/\/.*$/,"",$0); print}' としてみたのですが、 ディレクトリだけを取り出そうとしたのですが上手くいきません。 よろしくお願いします。 OSは、Solaris、Linuxになります。

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

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

  • awkのgsubによる置換

    awkのgsubで置換をしているのですが、置換後、全体をprintするため $0で出力したところ、セパレータがカンマ区切りから半角スペースに なってしまいます。 置換されなかった場合は、何事もなくそのまま出力されます。 これは、そのようなものなのでしょうか もし、カンマ区切りで出力したい場合は、ループなどで繰り返して 出す以外ないのでしょうか gawk -F"," '{if ($5=="1") {gsub($2,'abc',$2); print $0} else {print $0}}' hoge.txt

  • シェル:大量の比較方法に困ってます

    ファイル容量毎にフラグを付与したいと思ってます。 しかし、区分けが多いので判断する方法がわかりません。 例) 容量 ファイル名 13   aaa.txt 53 bbb.txt 153 ccc.txt 800 ddd.txt 1200 eee.txt ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 容量 ファイル名 フラグ 13   aaa.txt  0 53 bbb.txt 500 173 ccc.txt 1500 830 ddd.txt 8000 1220 eee.txt 10000 【判断基準】 容量   フラグ 1~50   0 51~100  500 101~150 1000 151~200 1500 201~250 2000  ・  ・  ・ 4901~4950 40000 4951~5000 45000 最終は5000まで判断させたいのですが記述方法がわかりません。 少ない判断でよければ cat aaa.log | awk 50<$2 '{print $2,"50",$3}' | awk $2<100 '{print $2,"50",$3}' な感じで挑戦してみたのですが・・・・。 ご教授お願いします

  • [シェルの質問]改行と結合

    bsh初心者です。 よろしくお願いします。 1)下記のような","で区切られている場合、","を見つけたら  改行して出力したいです。 [入力] aaa,bbb,ccc, ddd,eee,fff [出力] aaa, bbb, ccc, ddd, eee, fff 2)下記のように、ある文字"aaa"をみつけたら、その次の行と結合して  出力したいです。 [入力] aaa: Hello! [出力] aaa:Hello! とこんな感じです。 awkとか使わないとできないでしょうか? awkはあんまり詳しくないので、できたら 記述例をいただけると幸いです よろしくお願いします。

  • awk,sedの問題を教えて下さい。

    1)以下のファイルを元にして   aaa bbb ccc   ddd eee ffff   ggg hhh iiii   最初の欄だけとりだしてファイルにする方法は? 2)上記で元のファイルをベースにして1行コマンドで   下記の内容のファイルを作れ。    cat aaa > aaa.txt   cat ddd > ddd.txt   cat ggg > ggg.txt 3)以下のファイルに対してsedコマンドで   file1   file2   file3   下のようなファイルを作成せよ   cat file1 > /dev/null   cat file2 > /dev/null   cat file3 > /dev/null 上記3問宜しくお願い致します。

  • awkについて

    awkについて 今とあるファイルの/var/tmp/test 中の検索についてawkを使用しています。 123 abc 123-m 333 aaa-xx 1qwoko などタブキーで区切られています。 cat /var/tmp/test grep 123 | awk '$=="123"{print $2}' とやった場合存在するので 結果がでるのですが、その結果がない場合"NG"など文字列を出したいのですがどうすればいいでしょうか?

  • 文字変換で,を改行されないようにしたい

    下記のスクリプトでファイルから読み込んだ行毎の文字列<>を'=>'に変換後、行の先頭に'を付け足し行の最後に',を付け加えた場合、変な風に改行されてしまいます。 $ cat list1.txt 01<>ああああ 01_01<>あAAA 01_02<>あBBB 01_03<>あCCC 01_04<>あDDD 02<>いいいい 02_01<>いAAA 02_02<>いBBB 02_03<>いCCC 02_04<>いDDD open(IN, "<list1.txt"); @datas = <IN>; close(IN); open(OUT, ">date.txt"); foreach (@datas) { ($a, $b) = split(/<>/, $_); print OUT "'$a'=>'$b',"; } close(OUT); 実行結果 $ cat date.txt '01'=>'ああああ ','01_01'=>'あAAA ','01_02'=>'あBBB ','01_03'=>'あCCC ','01_04'=>'あDDD ','02'=>'いいいい ','02_01'=>'いAAA ','02_02'=>'いBBB ','02_03'=>'いCCC ','02_04'=>'いDDD ', これを下記のように整形するにはスクリプトのどこを直せばよいのでしょうか。 '01'=>'ああああ', '01_01'=>'あAAA', '01_02'=>'あBBB', '01_03'=>'あCCC', '01_04'=>'あDDD', '02'=>'いいいい', '02_01'=>'いAAA', '02_02'=>'いBBB', '02_03'=>'いCCC', '02_04'=>'いDDD', どなたかご教授お願い致します。(上記のスクリプト以外の方法で スマートなやり方などありましたらあわせてご教授頂けますと助かります。)

    • ベストアンサー
    • Perl
  • Cシェルでテキストファイルの行削除方法

    現在、Cシェルの勉強をしていますが、ある文言に完全一致した行のみ削除する方法が分かりません。 例として、下記のようなファイルがあり、"AAA"を指定して削除しようとすると、"AAA_1"までも削除されてしまいます。 例)test.txt AAA aaa AAA_1 aaa BBB bbb CCC ccc お手数ですがご教授いただけると幸いです。 以上、宜しくお願い致します。

このQ&Aのポイント
  • WindowsでMFC-J898Nを使用している方の中には、クラウドからリダイレクト印刷ができないという問題に直面している方もいるかもしれません。
  • 機種のページを見ても自分でよくわからない場合、対応していない機種なのかもしれません。
  • 詳しい方に教えていただけると助かります。
回答を見る

専門家に質問してみよう