awkコマンドの結果をパラメータとして渡します。

awkコマンドの結果をパラメータとして渡します。

awk2つの異なる列の値を取得したことがあるとします。

出力は次のように仮定します。

アルファベット

定義

今、私は前のコマンドでパイプを使用するためのパターンとしてとをabc使用したいと思います。これを行う方法はありますか?defgrep

詳細な手順については、次を参照してください。

PDFファイルがあり、以下を使用してファイル内のキーワードを検索しています。

pdftotext 'filename.pdf' - | grep 'pattern'

一致するものが見つかったら、結果の最初の列と2番目の列を前のコマンドを含むパイプラインでgrepの引数として使用しようとします。最初の2列を使用できます

pdftotext 'filename.pdf' - | grep 'pattern' | awk '{ print $1, "\t"$2 }'

さて、パイプラインでgrepコマンドの後にこれらの2つの値を上記の値に戻す(2番目の)パターンとして渡すにはどうすればよいですか?

答え1

次のようにプロセス置換を使用してこれを実行できます。

grep -f <(awk '{print $1 "\n" $3}' filename) otherfile

これはgrepファイル(フラグ)からパターンを読み取ります。この場合、実際には-f1行に1つのパターンを印刷するプロセスの出力です。awk...filenameそれからこれらのパターンを見つけてください。otherfile

grepそれほど効率的ではありませんが、実際にパイプでこれを行うには、標準入力から対応するパターンを読み取ることができます。

awk '{print $1 "\n" $3}' filename | grep -f - otherfile

編集:grepとawkの使用に関する質問編集内容を見ると、次のようにしてawkにパターンマッチングを実行させることができます。

grep -Ff <(awk '/pattern/ {print $1 "\n" $3}' <(pdftotext 'filename.pdf' -)) otherfile

またはパイプで:

pdftotext 'filename.pdf' - | awk '/pattern/ {print $1 "\n" $3}' | grep -Ff - otherfile

答え2

多くのシェルをサポートコマンドの置き換え例えば

p=$(awk '{ print $1,$3 }' filename)

コマンドの出力をawk '{ print $1,$3 }' filename変数としてキャプチャしますp。ここではcat重複するので、awkから直接行うことができますfilename

しかし、あなたが本当にやりたいことは処理することだと思います。言葉のない出力ラインをawk分析し、分離変わりやすい。この場合、次のことができます。

awk '{print $1,$3}' filename | while read -r p1 p2; do grep -F "$p1" otherfile | grep -F "$p2"; done

otherfileフィールド$1とfromの両方に$3一致する行を見つけますfilename

答え3

これはコマンド置換を使用して行うことができます。

から引用ここ:

コマンド置換を使用すると、コマンド名自体をコマンドの出力に置き換えることができます。コマンド置換は、コマンドに次のものが含まれている場合に発生します。

$(command)

または(バックティックバージョン):

`command`

答え4

xargsパラメータの渡しと定義の使い方を学ぶことができます。

cat filename|awk '{print $1,"\n"$3}'|xargs -I {} grep {} somefile

xargs -I {}grepが使用できるようにパラメータを「{}」に置き換えます。

関連情報