したがって、ファイルの列で正確に一致する数字を見つける必要があります。入力ファイルは次のようになります。
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はあなたの質問に表示されたサンプルデータです。