通过终端选择性地从分隔文件中提取字段

时间:2013-01-29 10:26:30

标签: linux bash unix awk grep

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

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

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

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

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

A=1 C=2

谢谢!

4 个答案:

答案 0 :(得分: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

修改

修正,新行也应被视为记录分隔符。

答案 1 :(得分: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' ' '

答案 2 :(得分: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"}'

答案 3 :(得分:0)

使用sed

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

输出

A=1 C=3