AWKについて質問です。いつまでたっても awk '{print $1}' これを覚えられません。

print {'$1'}だっけ?'print {$1}'だっけ?{'print $1'}だっけ?
と混乱します。

うまい覚え方はないでしょうか?
ゴロ合わせ、こじつけ、連想ゲーム、なんでもOKです。


回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2011/06/11 03:03:27
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント80pt

地味に難しいっすねー。

一応、正統派(と、思う)の回答を。


awk のスクリプトは、以下の形式を取ります。

行にマッチする条件 { 条件を満たしたときに実行するコード }

中括弧は、処理のブロックを表します。

他の言語でも、引数(パラメータ)を指定するときに、括弧を省略する流儀はあっても、

中括弧を使う流儀は、ほとんどありません。

print {...} は、まず、無いんです。


シングルクォートは、awk とは関係ありません。

シェル (bash とか csh とか) のパラメータのエスケープです。

シングルクォートで囲まないと、$ は awk が解釈する前に、シェルが解釈することがあります。


なので、print とかに関係なく、シェルから awk を呼び出すときは、awk '...' としておくのが、まず基本。

で、その中のコードは、中括弧でくくる。


全然、憶えやすくないですね orz

id:DQNEO

* {}は、ブロックである。

if(1){ .... } のようなものと考えればよいのですね!

* print {..} はどの言語でもありえない。

たしかに!

これで、{ print .. } となる理由がわかりました。

ありがとうございます!

awk '....' となるのは、echo '...' となるのと同じようなものと覚えておけばいいですかね。

2011/06/08 04:07:33

その他の回答2件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント80pt

地味に難しいっすねー。

一応、正統派(と、思う)の回答を。


awk のスクリプトは、以下の形式を取ります。

行にマッチする条件 { 条件を満たしたときに実行するコード }

中括弧は、処理のブロックを表します。

他の言語でも、引数(パラメータ)を指定するときに、括弧を省略する流儀はあっても、

中括弧を使う流儀は、ほとんどありません。

print {...} は、まず、無いんです。


シングルクォートは、awk とは関係ありません。

シェル (bash とか csh とか) のパラメータのエスケープです。

シングルクォートで囲まないと、$ は awk が解釈する前に、シェルが解釈することがあります。


なので、print とかに関係なく、シェルから awk を呼び出すときは、awk '...' としておくのが、まず基本。

で、その中のコードは、中括弧でくくる。


全然、憶えやすくないですね orz

id:DQNEO

* {}は、ブロックである。

if(1){ .... } のようなものと考えればよいのですね!

* print {..} はどの言語でもありえない。

たしかに!

これで、{ print .. } となる理由がわかりました。

ありがとうございます!

awk '....' となるのは、echo '...' となるのと同じようなものと覚えておけばいいですかね。

2011/06/08 04:07:33
id:sibazyun No.2

回答回数1823ベストアンサー獲得回数246

ポイント40pt

耳にかけているメガネのつるです。

      '{print $1}' 

・・・耳  '       ' 

・・・つる {      } 

【追記】あ、そうか。次でわかるかな。

 めがねのレンズではなく、

 耳にかけるところから、レンズまでの部分。  

id:DQNEO

すいません、「つる」って何でしょうか・・・

普段めがねをしないもので。

無知ですいません。

2011/06/08 04:08:41
id:Mook No.3

回答回数1314ベストアンサー獲得回数393

ポイント80pt

やはりきちんと意味を理解するのが良い気がします。


awk は第一引数として処理コードとしての処理内容を文字列指定します。

文字列内は、AWK の文法に従う必要があり、{} で囲まれた部分を各データに

対して実行しますが、他にも、前処理BEGIN{}と後処理END{}も記述できるの

で下記のような場合もあります。

$1 はデータから渡された第一引数を示しますのでこれに '' や {} が直接

付くことはありません。


これはデータファイル data.txt 内の各行の3番目までのデータを足して

合計を表示する例ですが、このようなケースがあるとわかれば

awk 'BEGIN{i=0}{i=i+$1+$2+$3}END{print i}'   data.txt

順番は理解できないでしょうか。


まとめると、$1データはいちばん内側、処理をまとめるのが{...}

全体を文字列'...'、というように理解すればよいかと思います。

id:DQNEO

* $1 はデータから渡された第一引数を示しますのでこれに '' や {} が直接つくことはない。

print $1は、Perl/PHP/シェルスクリプトと同じ、と覚えておけばいいですね。

ありがとうございます!

サンプルコードは私にはちょっと難しすぎるようです。。。

2011/06/08 04:11:37
  • id:sibazyun
    いやあ、awk、久しぶりだなあ。以前、ある仕事で、awk、sed、sortを多用した
    スクリプトで、人間がつくりあげたデータ一覧の並び方チェックをしたっけ。
  • id:KuroNeko666
    #id:a-kuma3 さんと同じになったのでコメント
    各記号の意味を、ちゃんと把握しておいたほうがいいです。
    シングルクォートは、引数をきちんと awk コマンドに文字列として渡すための処理。
    引数に中括弧 {} があって、中括弧の中で awk に何をさせたいのか記入する。
  • id:Mook
    C や Java など多くのプログラミング言語でもそうですが、{ }はブロックを
    あらわします。
    if () {
    :
    }

    while () {
    :
    }

    回答の中の例示が良くなかったですが、
    {i=i+$1+$2+$3}

    {i=i+$1; i=i+$2; i=i+$3;}
    と書いても同じで、{ }内にかける実行文は一つには限りません。

    {printf "Total <= %d + %d \n",$1,$2; i=i+$1; i=i+$2;}
    のようにいろいろな処理を書くこともできます。
    と考えると {} の意味は少しは理解できるでしょうか。

    http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_4.html
    など眺めるだけでも面白いかと思います。
  • id:DQNEO
    みなさんご丁寧な回答ありがとうございます。

    「真空パックのプリンが1ドル」
    というゴロ合わせを思いつきました。

    真空 → シングルクォート
    パック → {...}
    プリン → print
    1ドル → $1

    とりあえずこれで覚えれそうです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません