ファイルの複数の列の値を検索して一致させるには、awkコマンドをどのように変更しますか?

ファイルの複数の列の値を検索して一致させるには、awkコマンドをどのように変更しますか?

次のスクリプトが保存されておりbin、定義された変数に基づいて出力を取得するために使用されます。現在、スクリプトは列1に対して実行されており、出力を提供しています。列1または列2と一致するときに出力を提供するようにこのスクリプトをどのように更新できますか?

cat ~/bin/POUT

#!/bin/bash

exec awk -v arg=${1:?} '$1==arg' "${@:2}" inputfile

入力ファイル -:

 DEV       RETAIL          RETAILDEVNode  
TEST      RETAILTEST       RETAILTESTNode 
TEST       AUDIT            AUDITTESTNode
QA         AUDITQA         AUDITQANode
PROD       SALE            SALEPRODNode
QA         SALEQA           SALETESTNode
QA        FINANCE         FINANCEQANode
PROD      FINANCE         FINANCEPRODNode

現在予想される結果を得ています -

$ POUT QA
QA         AUDITQA         AUDITQANode
QA         SALEQA           SALETESTNode
QA        FINANCE         FINANCEQANode

また、次のような出力が必要です(列2でも検索)。

$ POUT AUDITQA
QA         AUDITQA         AUDITQANode

Want output like this also (put any matching value and search in column 2 aslo) ---

$ POUT DITQ 
QA         AUDITQA         AUDITQANode

したがって、変数に入力が何であれ、列1と列2を検索して出力を提供する必要があります。

ベストアンサー1

#!/bin/bash
arg="${1:?}"    # Capture argument value or fail
shift

awk -v arg="${arg//\\/\\\\}" 'index($1, arg) || index($2, arg)' "$@" inputfile

シェル変数を使用するときは常に二重引用符を使用してください。 (例外が発生する理由を理解するまでこれは本当です。それまでは常に二重引用符を使用してください。)

$argシェル変数は、バックスラッシュ処理をキャンセルするためにawk変数をランダムに変数に割り当てます。argawk

残りのコマンドライン引数を渡す理由は理解できません。awk そしてinputfile継続的なソースとして提供されます。それでも意図した場合に備えて保管しました。

おすすめ記事