awk コマンドは、列 1 と 2 の部分一致の出力を提供しません。

awk コマンドは、列 1 と 2 の部分一致の出力を提供しません。

変数と一致し、出力を提供する次のスクリプトを実行するのに役立ちます。スクリプトが動作しています。精密列1と2と一致するが、部分のマッチ。

cat ~/bin/MYSH

#!/bin/bash
arg="${1:?}"
awk -v arg="${arg//\\/\\\\}" '$1 == arg || $2 == arg' "$@"  inputfile

入力ファイル -

1111       1111RETAIL          RETAIL8888Node  
2222       2222RETAIL          RETAIL7777Node 
3333       3333AUDITTEST       AUDIT6666Node
4444       4444AUDIT           AUDIT3333Node
5555       5555SALE            SALE4444Node
6666       6666SALE            SALE2222Node
7777       7777FINANCE         FINANCE1111Node
8888      8888FINANCE          FINANCE5555Node

スクリプトは、以下のように、列1または2に入力された単語と正確に一致する項目を検索して出力を提供します。

$ MYSH 6666
6666       6666SALE            SALE2222Node

$ MYSH 4444AUDIT
  4444       4444AUDIT           AUDIT3333Node

また、以下のように、列2に2〜3文字または一致する文字がある場合に出力を提供するには、このスクリプトが必要です。

予想出力 -

$ MYSH 4444AU
  4444       4444AUDIT           AUDIT3333Node

または

 MYSH 7777FINAN
  7777       7777FINANCE         FINANCE1111Node

答え1

テスト$1 == arg本物arg最初のフィールドの値が変数と等しい場合。値がargどこかにあるかどうかをテストするには、$1この関数を使用できますindex()。この関数は、部分文字列が見つかった場所を返し、見つからない場合は0を返します。

#!/bin/sh

arg=${1:?} awk 'index($1,ENVIRON["arg"]) || index($2,ENVIRON["arg"])' inputfile

フィールドの先頭でのみ部分文字列を一致させるには、関数のindex()戻り値が1であることを確認してください。

#!/bin/sh

arg=${1:?} awk 'index($1,ENVIRON["arg"])==1 || index($2,ENVIRON["arg"])==1' inputfile

また、スクリプトの最初の引数をawk環境変数としてコマンドに渡して、バックスラッシュを二重スラッシュに変更せずに使用できるようにしました。

一つできる$1 ~ ENVIRON["arg"]ユーザー指定の値を最初のフィールド値の正規表現として使用して正規表現一致を実行する使用(または$1 ~ "^" ENVIRON["arg"]最初にのみ一致)も可能です。しかし、これはユーザーが自分が提供していることを知らない限り不適切です。正規表現文字列ではなく。

関連情報