ファイルのフィールドを含む文字列を使用して出力を印刷するには?

ファイルのフィールドを含む文字列を使用して出力を印刷するには?

「filename」というファイルで「yellow」という単語を含む行を探しているとしましょう。その後、出力に「シャツの色は黄色です」と表示したいと思います。

「filename」ファイルから抽出した行が次のようになるとします。

blue green orange black purple white yellow pink

私はこのように考えていましたが、それが正しくないことを知っています。

cat filename | grep yellow | awk '{print $7; echo "The colour of the shirt is {$7}}

答え1

デフォルトでは、grepを使用した後、1行の出力を取得しました。次に、行の7番目のフィールドを入力し、「シャツの色は「{フィールド7の出力}」と言いたいと思います。

まあ、それはもっと理解できます。

文字列で7番目のフィールドを印刷するには、次のようにします。

awk '{ printf "The color is %s\n", $7 }'

または

awk '{ print "The color is " $7 }'

(引用符で囲まれた文字列との間にはカンマやプラス記号、または何もありません。$7文字列は互いに隣に書くだけでawkで連結されます。)

grepスキップして内部的に同じことを行うこともできますawk

awk '/some regex/ { printf "the seventh field is %s\n", $7 }'

awk で許される正規表現はgrep -E.(微妙な違いがあるかどうか覚えていないので、「ほとんど」) と同じです。ただし、パターンマッチングを特定のフィールドとして指定することもできます。

awk '$3 ~ /regex for field three/ { printf "the seventh field is %s\n", $7 }'

もちろん、一致するすべての行を処理します。愚かな例:

$ awk '$1 ~ /^j/ { printf "the shirt of %s is %s\n", $1, $2 } ' < shirts
the shirt of jimmy is blue
the shirt of joe is red

答え2

awk ‘/yellow/ { print “The colour of the shirt is yellow” }’ < filename 

答え3

君は全部できるawk ジェフが示すように、またはシェルで簡単に実行できます。

if grep -qF 'yellow' "filename"; then
    echo 'The colour of the shirt is yellow'
fi

ここでは何も出力-qせずgrep(終了状態にのみ関心があるgrep)、「固定文字列」(正規表現ではない)を使って検索していることを-F知らせます。grep


コンテンツがある場合

[some unrelated data here]
shirt colour: yellow
[some unrelated shirt data here]

その後利用できます

awk '/^shirt colour:/ { print "The colour of the shirt is", $NF }' filename

$NF...与えられた正規表現に一致する行の最後のフィールド()にある単語を使用してメッセージを出力します。

または、

awk '/^shirt colour:/ { printf("The colour of the shirt is %s\n", $NF) }' filename

$3最後の2つの例では、(「最後のフィールド」)の代わりに(「スペースで区切られた3番目のフィールド」)を使用することもできます$NF

関連情報