質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

2回答

2392閲覧

awkのコマンドの意味がわからない

imamoto_browser

総合スコア1161

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

1クリップ

投稿2017/05/24 10:46

編集2017/05/24 10:47

下記コマンドの意味が分からなくて困っています。

awk '{a[$1FS$2]=a[$1FS$2]FS$NF} END {for(i in a) print i a[i]}' file.txt

file.txt

txt

1 A 123 BC 2 A 123 DD 3 A 123 TT 4 B 456 AA 5 B 456 RR 6 C 789 EE 7 A 123 GT

特に、{a[$1FS$2]=a[$1FS$2]FS$NF}がよくわからないのですが、NFはフィールド数、FSはデフォルトのセパレータなので空白スペースだと認識しているのですが、なぜ、それで結果が

txt

1A 123 BC DD TT GT 2C 789 EE 3B 456 AA RR

となるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiTK

2017/05/24 10:49

うちの awk では違う結果になりました。file.txt は合ってますでしょうか?
guest

回答2

0

ベストアンサー

スクリプトは第一第二フィールドを空白を挟んで連結した文字列をキーとした連想配列を使ってますので、第一第二フィールドが共通な行について最後のフィールドを連想配列aの要素として連結していくという意味になります。NFは常に3になります。そのため$NFは$3すなわち3番目のフィールド=最後のフィールドという意味になります。

ENDではaのキーを取り出してそのキーの要素をキーとともに印字しているだけです。

どこが腑に落ちないか今一つはっきりしませんが、aが連想配列であるという点に気づかれてないのだろうと推測しました。

例えば最初の行は次のような雰囲気で実行されます。

a['A 123']=a['A 123']" BC"

投稿2017/05/24 11:09

編集2017/05/24 11:11
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imamoto_browser

2017/05/24 21:38

ここでのENDはlinuxでいうパイプのような役割と考えてよいのでしょうか。BEGINは必須ではないということですよね?
KSwordOfHaste

2017/05/24 23:14

かなり違います。パイプなら前段のコマンドと並行して後段が同時に動きます。awkのENDは入力行の処理が全て終わった後で(入力をEOFまで処理し終わった後で)実行されます。
imamoto_browser

2017/05/26 08:03

なるほどフックされるタイミングがちがうというわけですか。awkは使い倒して慣れていくしかないですね。
KSwordOfHaste

2017/05/26 08:11

大抵は「awkとはこういうもの」という肝心な点だけ押さえておいて、実際に使う機会が来た時に細かな点を覚えるのが一番頭に入ると思います。自分はlinuxのコマンドを端から端まで全部覚えていられるほど記憶力はよくないので、知りたくなった時に調べるようにしています。
guest

0

http://lagendra.w3.kanazawa-u.ac.jp/ogurisu/manuals/awk/intro/node26.html

こちらの解説を読むと理解できるかと思いますがいかがでしょうか。
NF と $NF は違いますのでご注意ください。

file.txt はこの内容が正しそうですね。

A 123 BC A 123 DD A 123 TT B 456 AA B 456 RR C 789 EE A 123 GT

投稿2017/05/24 10:59

SugiTK

総合スコア495

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問