AWKは、括弧内のカンマで区切られた列の正確な値と一致します。

AWKは、括弧内のカンマで区切られた列の正確な値と一致します。

したがって、ファイルの列で正確に一致する数字を見つける必要があります。入力ファイルは次のようになります。

33.xx  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [11,22,33] 2020-12-12 12:12:12.1234
24.1b  1131  0 0 0 some+text1 12:12:12.9999  9999:090909 88 [1,25,22] 2020-12-12 12:12:12.1234
1.52  1211  0 0 0 some+text3 12:12:12.9999  9999:090909 88 [22,2,123] 2020-12-12 12:12:12.1234

22括弧の間の値の1つである行のみを一致させて最初の列を出力したいと思います。

答え1

awkを使用してください。

$ awk '$(NF-2) ~ /[[,]22[],]/{print $1}' file
33.xx
24.1b
1.52

明るく晴れた日に一致するものを探している状況の異常を含む、より包括的な入力例で一致を見つけることを期待しています。

$ cat file
33.xx  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [11,22,33] 2020-12-12 12:12:12.1234
24.1b  1131  0 0 0 some+text1 12:12:12.9999  9999:090909 88 [1,25,22] 2020-12-12 12:12:12.1234
1.52  1211  0 0 0 some+text3 12:12:12.9999  9999:090909 88 [22,2,123] 2020-12-12 12:12:12.123
1.good  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [22] 2020-12-12 12:12:12.1234
2.good  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [11,22] 2020-12-12 12:12:12.1234
3.good  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [22,33] 2020-12-12 12:12:12.1234
4.good  1111  0 0 0 foo bar 12:12:12.9999  9999:090909 88 [11,22,33] 2020-12-12 12:12:12.1234
5.bad  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [11,33] 2020-12-12 12:12:12.1234
6.bad  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [11,222,33] 2020-12-12 12:12:12.1234
7.bad  1111  0 0 0 this is [22] fun 12:12:12.9999  9999:090909 88 [11,33] 2020-12-12 12:12:12.1234

これが生成する出力は次のとおりです。おそらくOPが期待していたのでしょう。

$ awk '$(NF-2) ~ /[[,]22[],]/{print $1}' file
33.xx
24.1b
1.52
1.good
2.good
3.good
4.good

私は$(NF-2)各行の先頭ではなく最後からフィールドを計算するのに慣れているので、some+text実際に含まれているものに関係なく動作します。スペースが含まれていない場合は代わりにsome+text使用できます。$10$(NF-2)

答え2

使用pcregrep:

$ pcregrep -o1 '(\S*).*(\[(\d+,)*22(,\d+)*])' file

使用awk:

次のコマンドを使用できます。

$ nawk '$(NF-2) ~ /\[([[:alnum:]]*,)*22(,[[:alnum:]]*)*]/{print $1}' file

アルファベット文字が必要ない場合は、このコマンドを変更できます。

$ awk '$(NF-2) ~ /\[([[:digit:]]*,)*22(,[[:digit:]]*)*]/{print $1}' file

括弧内の値が欠落していることを望まない場合は、次のようにします。

$ awk '$(NF-2) ~ /\[([[:digit:]]+,)*22(,[[:digit:]]+)*]/{print $1}' file

答え3

次の操作が実行されます。

awk -F"[][]" '$2~"22"{print }' <input file>

ここで、区切り文字は[またはに設定され]、2番目のフィールドに22が含まれていることを確認します。

確認したい値が正確に22の場合は、次のものを使用できます。

awk -F"[][]" '$2~",22" || $2~"22,"{print }' <input file>

絶対的な厳格さを探している場合は、次のようなものを使用できます。

awk -F"[][]" '{split($2,a,","); for (i in a) if(a[i]==22) {split($1,b," ");print b[1];break} }'   <input file>

答え4

私はあなたが望む一致がある行の最初の列にのみ興味があると思います。この場合、grepを使用する方法は次のとおりです。

$ egrep '\[.*\,22,|\[22\,|\,22\]' infile.txt | cut  -d' ' -f1
33.xx
24.1b
1.52

infile.txtはあなたの質問に表示されたサンプルデータです。

関連情報