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

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

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

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

2回答

3413閲覧

awkコマンド,FILENAMEを使用した処理内容

ajax

総合スコア12

Linux

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2018/04/19 14:59

サイトを見ていた時に理解できない処理がございました。
コードの意味を教えて頂ければと思います。

<<コード>>
$ 〜〜〜〜〜〜〜〜
| awk -F'[<> "]' '/t="s"/{print $4,"s",$(NF-4)}!/t="s"/{print $4,"n",$(NF-4)}'
| awk 'FILENAME=="strings"{s[$1]=$2}FILENAME=="-"&& $2=="s"{print $1,s[$3]}$2=="n"{print $1,$3}' strings -

上記の下2行の処理内容の意味が理解出来ません。
どうぞ、宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

スクリプト部分を抜き出して改行を入れてみました。

FILENAME=="strings"{s[$1]=$2} #1 FILENAME=="-"&& $2=="s"{print $1,s[$3]} #2 $2=="n"{print $1,$3} #3

おそらくstringsなるファイルの中では

x 10 y 20

のように「項目名 値」が記入されているものと思います。
1行目は、連想配列sにデータを格納していく処理です。ここで取り込まれた情報は後でs["x"]のようにして利用できます。
2行目は、入力元が標準入力である場合に、各行の第1コラムとs[第3コラム]の値を並べて出力しています。ここではパイプでつながっている前段のawkの出力が「ほにゃらら s ほにゃほにゃ」の場合と「ほにゃらら n ほにゃほにゃ」の場合があり、前者の場合のみ出力を行うということになります。
3行目は、入力元としてstringなるファイルと標準入力を並べて指定しているだけです。

以上ですが、全体的に不思議なスタイルのスクリプトだなとは思います。無駄に場合分けして、無駄に条件判定してフィルタリングしてますね。一つのスクリプトで半分のコード量で同じことができるはずですが、なぜこんな謎な書き方をしているのか…。

投稿2018/04/19 18:47

KojiDoi

総合スコア13671

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

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

ajax

2018/04/19 23:57

コメント頂きまして、ありがとうございます。 >1行目は、連想配列sにデータを格納してい >く処理です。ここで取り込まれた情報は後 >でs["x"]のようにして利用できます。 "strings"{s[$1]=$2} 《stringsファイル》 x 10 y 20 上記では、10、20が設定されているが、スクリプトの中でs[$1]が記述されていないので呼び出されていないという事でしょうか? >2行目は、入力元が標準入力である場合に、>各行の第1コラムとs[第3コラム]の値を並べ>て出力しています。 s[第3コラム]ですが、連想配列を《stringsファイル》から作成しているので第2カラムまでしか存在しないですが、第3は何処から生成されたんでしょうか? >無駄に場合分けして、無駄に条件判定して >フィルタリングしてますね。一つのスクリ >プトで半分のコード量で同じことができる >はずですが、なぜこんな謎な書き方をして >いるのか…。 半分のコード量で、より簡単に出来る方法を知りたいです! イメージの共有だけでも、お願い致します!! 謎な書き方になっている理由としては、ワンライナーで記述しているからかもしれないです。 *スマホから、投稿しているので変な箇所で改行とかされていたらすいません。。
KojiDoi

2018/04/20 04:28

> s[第3コラム]ですが、連想配列を《stringsファイル》から作成しているので第2カラムまでしか存在しないですが、第3は何処から生成されたんでしょうか? これらのコラムは「標準入力」からくるのでちゃんと$3は存在するはずです。 どうもawkの基本の基本がわかっておられないような気がします。とりあえずawkの「パターン」「アクション」「連想配列」の三つの概念を入門書で確認することをお勧めします。
ajax

2018/04/25 13:15

ありがとうございました!
guest

0

何が分からないのか、書いてないので分かりませんが、タイトルからすると、FILENAMEの部分でしょうか?

2つ目のawkコマンドでは、処理対象のファイルがstringというファイルと、-で表される標準入力つまり1つ目のawkコマンドの出力と2つあります。
どちらのファイルが対象かによって処理を変えています。

投稿2018/04/19 15:08

otn

総合スコア84555

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

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

ajax

2018/04/19 15:18

ご回答頂き、ありがとうございます! 下記3箇所の意味が理解出来ません。 > | awk 'FILENAME=="strings"{s[$1]=$2} FILENAMEがstringsの時に処理を行う{s[$1]=$2}の{s[$1]=$2}の箇所① >FILENAME=="-"&& $2=="s"{print $1,s[$3]}$2=="n"{print $1,$3}' strings - FILENAMEが-の時に処理を行う{print $1,s[$3]}の{print $1,s[$3]}の箇所② strings - の箇所③ ①、②に関してはs[$1],s[$3]のs[ ] ③に関してはこの場所でどんな働きをしているのか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問