说我有这个文件data.txt
:
a=0,b=3,c=5
a=2,b=0,c=4
a=3,b=6,c=7
我想使用grep
提取与a
和c
的值对应的2列:
0 5
2 4
3 7
我知道如何分别提取每个列:
grep -oP 'a=\K([0-9]+)' data.txt
0
2
3
和
grep -oP 'c=\K([0-9]+)' data.txt
5
4
7
但我无法弄清楚如何提取这两组。我尝试了以下,但没有用:
grep -oP 'a=\K([0-9]+),.+c=\K([0-9]+)' data.txt
5
4
7
答案 0 :(得分:5)
您可以尝试以下grep命令。但请注意,grep会在单独的新行中显示每个匹配项。所以你不会得到你在问题中提到的格式。
$ grep -oP 'a=\K([0-9]+)|c=\K([0-9]+)' file
0
5
2
4
3
7
要获得上述格式,您需要将grep
的输出传递给paste
或任何其他命令。
$ grep -oP 'a=\K([0-9]+)|c=\K([0-9]+)' file | paste -d' ' - -
0 5
2 4
3 7
答案 1 :(得分:4)
我也很好奇grep
能够这样做。 \K
“删除”以前存储的内容,因此您不能在同一个表达式中使用它两次:它只显示最后一个组。因此,它应该以不同的方式完成。
同时,我会使用sed
:
sed -r 's/^a=([0-9]+).*c=([0-9]+)$/\1 \2/' file
它会在a=
和c=
之后捕获数字,只要在以a=
开头并且在c=digits
之后不包含任何其他内容的行发生这种情况。
对于您的输入,它会返回:
0 5
2 4
3 7
答案 2 :(得分:0)
使用它:
awk -F[=,] '{print $2" "$6}' data.txt
我将分隔符用作=
和,
,然后拆分它们