1

如果我有一个分隔文件,例如;

A=1|B=2|C=3|D=4|E=5|F=6

我想提取某些字段并仅使用标准 unix 工具(即 grep、awk、cut)将它们打印在一行上。我怎么能这样做?

文本字段可能并不总是以相同的顺序排列,并且一行可能比另一行多。我希望能够根据它们的开头选择字段。

因此,上面对 A= 和 C= 的查询应该将以下内容输出为一行;

A=1 C=2

谢谢!

4

4 回答 4

1

我建议使用支持将 RS 指定为正则表达式的 awk 版本,例如 gawk 或 mawk:

echo 'A=1|B=2|C=3|D=4|E=5|F=6' | 
  awk -v RS='[|\n]' -v ORS=' ' -v pat='(A|C)=' '$0 ~ pat'; echo

或者如果你想避免最后的回声:

echo 'A=1|B=2|C=3|D=4|E=5|F=6' | 
  awk -v RS='[|\n]' -v ORS=' ' -v pat='(A|C)=' '$0 ~ pat; END { printf "\n" }'

我的最爱:

echo 'A=1|B=2|C=3|D=4|E=5|F=6' | 
  awk '$0 ~ pat' RS='[|\n]' ORS=' ' pat='(A|C)='; echo 

输出:

A=1 C=3

编辑

错误修复,换行符也应该被视为记录分隔符。

于 2013-01-29T10:32:44.363 回答
0

这符合您的需求吗?

kent$  echo "A=1|B=2|C=3|D=4|E=5|F=6"|grep -Po "(?<=\||^)(A=|C=)[^|]*"
A=1
C=3

如果你想要它在单行,管道它tr '\n' ' '

于 2013-01-29T10:31:30.730 回答
0

你也可以使用这个:

awk -F"|" '{for(i=1;i<=NF;i++){if($i~/[A|C]\=/)printf $i" "}}'

你也可以使用 perl:

perl -lne 'push @a,/[A|C]=\d+/g;END{print "@a"}'
于 2013-01-29T11:49:31.580 回答
0

使用 sed

sed -re 's/(A=[0-9]+)(.*)(C=[0-9]+)(.*)/\1 \3/' temp.txt

输出

A=1 C=3

于 2013-01-30T02:57:02.870 回答