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

使用任何 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>

这里分隔符设置为[or]并检查第二个字段是否包含 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 是您的问题中显示的示例数据。

相关内容