如果我有分隔文件,例如;
A=1|B=2|C=3|D=4|E=5|F=6
我想提取某些字段并仅使用标准的unix工具(即grep,awk,cut)将它们打印在一行上。我怎么能这样做?
文本字段可能并不总是以相同的顺序排列,并且一行上可能多于另一行。我希望能够根据它们的开头选择字段。
因此,对A =和C =的上述查询应将以下内容输出为单行;
A=1 C=2
谢谢!
答案 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