• ベストアンサー

awkとsedですが、これが何をしているか解説お願いできますでしょうか?

丸投げで大変申し訳ございません。 これが何をしているかどなたか解説お願いできませんでしょうか? HOGE1=`awk 'NR=='$_HOGE2'' hogehoge |sed 'y/:/\n/'|awk 'NR=='1''` よろしくお願いいたします。

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8524/19373)
回答No.1

awk 'NR=='$_HOGE2'' hogehoge hogehogeを読んで、読んだ行が$_HOGE2行目だったなら、その行のみをsedに渡す sed 'y/:/\n/' 「:」を「改行」に置換する。つまり「:」ごとに区切られた項目を、1行づつに分解してswkに渡す 「あああ:aaa:111:ddd」と言う行なら あああ aaa 111 ddd の4行になる。 awk 'NR=='1'' 1行目を出力する。 最終的な出力結果は、変数「HOGE1」に代入される。 で、結局は「hogehogeファイルの$_HOGE2行目を:で区切って、1項目をHOGE1に代入する」ってこと。 そして、この処理は「awk1つで書ける」ので「awk呼んでsed呼んでawkをまた呼んで」と言う「遅くて無駄ありすぎでプロセス食い過ぎな馬鹿な処理」は改良の余地がある。 ヒント ・awkには「項目の区切り文字を何にするか」を指定する変数FSがある ・awkには「1番目の項目」だけを出力する機能がある

関連するQ&A

  • awkで単語単位での置換

    awkを使って単語単位の置換を行いたいのですが、うまく行きません。 awkで単語単位で置換を行うのにはどの様にすれば宜しいのでしょうか? 何方かご存知の方いらっしゃいましたらご教授願います。 具体的にはsedの以下のコマンドと同等の事をawkで行いたいと思っています。 sed 's/\b置換前の単語\b/置換後の単語/g' 例: ・ファイルの内容 hogehoge abcdefg hogehoge hogehoge bcdef hogehoge hogehoge bcd hogehoge hogehoge abcd hogehoge hogehoge bcd hogehoge bcdef bcd hogehoge 上記ファイルをawkで1行ずつ読み込みの3,5,7行目の”bcd”のみ”HIJ”に置き換える事をしたいと考えています。 下記を試してみたのですが、うまく行きませんでした。 1.awk '{gsub(/\bbcd\b/, "HIJ", $0); print $0}' 2.awk '{gsub(/(bcd)/, "HIJ", $0); print $0}' 1だと全く置換されず、2だと3,5,7行目以外も置換されてしまいます。 どの様にしたらうまく行くのでしょうか?

  • awk match関数

    awkのmatch関数で、 awk -F":" 'match($2, "/hogehoge/") {print $0} ファイル名 は、動きます。 たとえば、検索条件に"/"が入ってるときは、 awk -F":" 'match($2, "#hoge/hoge#") {print $0} ファイル名 ってやりたいんですが、動きません。 こういうもんなのですか?? awk -F":" 'match($2, "/hogehoge/i") {print $0} ファイル名 も、気持ち的に動いてほしいですが、これも、動きません。 こういうもんなのですか?? tolower($2) を使えば、それですみますが・・・ 質問が、2つになってしまいました。すみません。 よろしくお願いいたします。

  • awkの入力ファイルをリダイレクト先にする方法

    ---------hoge.txt--------- hoge hoge hoge ------------------------- 等としておいて、 $ awk '{print NR":"$1;}' hoge.txt とすると標準出力に ------------------------- 1:hoge 2:hoge 3:hoge ------------------------- と表示されますが、これを $ awk '{print NR":"$1;}' hoge.txt > hoge.txt と自分自身にリダイレクトするとhoge.txtは空になってしまいます。 hoge.txtに上の標準出力を上書きするにはどのように書けば良いのでしょうか、教えてください。 awkだけでなく、テキストファイルを入力にできるコマンド一般についても 上記のようなことができる方法があれば、教えていただきたいです。

  • awk詳しい方へ

    あるファイルの最終行のみ、他の行と出力形式を変えたいのですが awkとNRを使ってスマートにできないでしょうか? 詳しい方ご教授お願いします。 不細工に作ると(ファイル名xxxのとき) nnn=`wc -l xxx | awk '{print $1}'` awk '{ if (NR != $nnn) printf("%s %s \n",$1,$2) else printf("%s %s \n",$3,$4) }' aaa こんな感じでしょうか。 なんか、一行とかでかけないでしょうか?

  • sedでの改行置換

    sedを用いた処理で質問があります。 出力結果の改行を置換して一列として表示しようとしているのですが、どうもうまくいきません。 (perlは敢えて使いません) 例えば、以下のようなファイルがあるとして、 $ cat hoge.txt hoge boo bar この出力結果を加工して、「hoge boo bar」のように、 改行をスペースに置換して一行として表示したい場合は、どのようにすれば良いでしょうか? ちなみに、以下のような使い方だと、うまくいきませんでした。 $ cat hoge.txt | sed 's/\ > / /g' $ cat hoge.txt | sed 's/\n/ /' ■実行環境 OS : RedHat EL 1 sedのバージョン : sed-4.0.7-3 宜しくお願い致します。

  • 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等で、CSVに任意の列を追加する方法

    こんにちは。 awkやsedなどで、データが並んだCSVファイルの任意の列に 1列データ(追加の列に入るデータは固定)を入れたいのですが、 良い方法は無いでしょうか? 下記のように x00,x01,・・・x49,x50・・・x98,x99 y00,y01,・・・y49,y50・・・y98,y99 を x00,x01,・・・x49,[追加列],x50・・・x98,x99 y00,y01,・・・y49,[追加列],y50・・・y98,y99 というように入れられるようにしたいです。 列の量は100項目程度あるのですが、大量の変数を使用しないことが条件です。 要は、awkの中に$1. $2, $3・・・$100というように変数をベタ書きしない方法でお願いいたします。

  • シェルでファイルを読み込む

    csh を使っています。 ファイル hoge には1行に一つずつファイルの / からのパスが記されています。 hoge から 1行ずつファイルパスのリスト読み込んでそのファイルについて ls -al を行なった結果をファイル foo に保存したいのですが、どのようなシェルプログラムを作れば宜しいでしょうか? awk/sed も使える環境ですので、これらを使ったスクリプトでも構いません。 非常に初歩的な質問で申し訳ありませんが、宜しくお願いします。

  • load averageが0.50を超えた時だけメール送信

    LINUXでtopコマンドのロードアベレージが0.50を超えた時に top.logファイルに内容を記述してさらにメールを送る。 0.50を超えない場合には何も残さないというスクリプトを 作りたいのですが、うまくいきません。 ifの書き方などが悪いのでしょうか #!/bin/sh AVE=`top -b -n1 |sed 'y/,/ /' |awk '{if(1>=NR){print $(NF-2)}}'` if [ $AVE > 0.50 ]; then echo ----------------------------------------------------------------------------- >> ./top.log top -b -n1 |awk '{if(5>=NR){print}}' >> ./top.log echo ----------------------------------------------------------------------------- >> ./top.log printf "USER PID %%CPU %%MEM VSZ RSS TTY STAT START TIME COMMAND\n" >> ./top.log ps aux |sort +4r |head -10 >> top.log echo ----------------------------------------------------------------------------- >> ./top.log echo ----------------------------------------------------------------------------- >> ./top.log mail -s load_average root < top.log else echo ok fi 今はとりあえず0.50を超えない時はOKと出力されるように してますが、何もログを残さずメールも送らないように したいのです。どなた様か教えてくださいませ!

  • バッチファイルでテキストファイルを分割したい

    テキストファイルを、指定した数値の倍数の行を、指定した個数に分割するバッチファイルを作成しようとしています。 例えば、以下の様な内容の「in.txt」というテキストファイルを3分割したい場合、 ----- in.txtの内容 ----- 1 2 3 4 5 6 7 8 9 10 ------------------------ 以下の様な内容で、 「out1.txt」「out2.txt」「out3.txt」として出力したいのです。 ----- out1.txtの内容 ----- 1 4 7 10 -------------------------- ----- out2.txtの内容 ----- 2 5 8 -------------------------- ----- out3.txtの内容 ----- 3 6 9 -------------------------- 自分はプログラミングの知識がないので、WEBに書かれている構文を少し書き換えたりして試しているのですが、うまく行きません。 AWKを使い、以下のようなバッチファイルを作成して実行してみましたが、「out3.txt」だけがうまく行きませんでした。構文の意味も分からないので修正も出来ません。 awk "NR%%3==1" "in.txt" > "out1.txt" awk "NR%%3==2" "in.txt" > "out2.txt" awk "NR%%3==3" "in.txt" > "out3.txt" AWKの解説ページを読み始めたのですが、時間的な猶予があまり無く、今回質問させて頂いた処理が出来るようになるまでまだ時間が掛かりそうなので、どなたかお分かりの方がおられましたお教え頂けないでしょうか。 AWKでなくとも、sedでもPerlでもその他のコマンドでも構いませんし、スクリプトファイルを読み込めるコマンドでしたらスクリプトでの書き方でも結構ですので、ご存知の方がおられましたらお教え頂けないでしょうか。