awk
2つの異なる列の値を取得したことがあるとします。
出力は次のように仮定します。
アルファベット
定義
今、私は前のコマンドでパイプを使用するためのパターンとしてとをabc
使用したいと思います。これを行う方法はありますか?def
grep
詳細な手順については、次を参照してください。
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
ファイル(フラグ)からパターンを読み取ります。この場合、実際には-f
1行に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が使用できるようにパラメータを「{}」に置き換えます。