如果我有一个分隔文件,例如;
A=1|B=2|C=3|D=4|E=5|F=6
我想提取某些字段并仅使用标准 unix 工具(即 grep、awk、cut)将它们打印在一行上。我怎么能这样做?
文本字段可能并不总是以相同的顺序排列,并且一行可能比另一行多。我希望能够根据它们的开头选择字段。
因此,上面对 A= 和 C= 的查询应该将以下内容输出为一行;
A=1 C=2
谢谢!
我建议使用支持将 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
错误修复,换行符也应该被视为记录分隔符。
这符合您的需求吗?
kent$ echo "A=1|B=2|C=3|D=4|E=5|F=6"|grep -Po "(?<=\||^)(A=|C=)[^|]*"
A=1
C=3
如果你想要它在单行,管道它tr '\n' ' '
你也可以使用这个:
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"}'
使用 sed
sed -re 's/(A=[0-9]+)(.*)(C=[0-9]+)(.*)/\1 \3/' temp.txt
输出
A=1 C=3