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

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

ただいまの
回答率

90.54%

  • Linux

    3761questions

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

  • sh

    281questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 263

ajax

score 3

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

<<コード>>
$ 〜〜〜〜〜〜〜〜
| 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行の処理内容の意味が理解出来ません。
どうぞ、宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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/20 08: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は何処から生成されたんでしょうか?

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

    半分のコード量で、より簡単に出来る方法を知りたいです!
    イメージの共有だけでも、お願い致します!!
    謎な書き方になっている理由としては、ワンライナーで記述しているからかもしれないです。

    *スマホから、投稿しているので変な箇所で改行とかされていたらすいません。。

    キャンセル

  • 2018/04/20 13:28

    > s[第3コラム]ですが、連想配列を《stringsファイル》から作成しているので第2カラムまでしか存在しないですが、第3は何処から生成されたんでしょうか?
    これらのコラムは「標準入力」からくるのでちゃんと$3は存在するはずです。

    どうもawkの基本の基本がわかっておられないような気がします。とりあえずawkの「パターン」「アクション」「連想配列」の三つの概念を入門書で確認することをお勧めします。

    キャンセル

  • 2018/04/25 22:15

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/20 00: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[ ]
    ③に関してはこの場所でどんな働きをしているのか?

    キャンセル

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

  • ただいまの回答率 90.54%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Linux

    3761questions

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

  • sh

    281questions

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