所以我需要从文件中的一列中找到精确的数字匹配。输入文件类似于以下内容:
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 是您的问题中显示的示例数据。