有没有办法从包含文本的另一列中减去包含文本的数据列并获得包含唯一字符的第三列,例如使用 awk 例如。
输入
ab a
cd d
efg ef
期望的输出:
ab a b
cd d c
efg ef g
答案1
是的,awk
是一个合适的选择:
awk 'NF{t=$1;gsub("["$2"]","",t);print$0,t}' input
如果第二个字段可能包含正则表达式字符类中具有特殊含义的字符,则必须对这些字符进行转义。在 POSIX 中解决这个问题awk
很长,所以我只发布 GNUawk
替代方案:
gawk 'NF{print$0,gensub("["gensub(/([\[\]^-])/,"\\\\\\1","g",$2)"]","","g",$1)}' input
答案2
Manatworks 的解决方案当然没问题。这只是一个纯粹的 bash 替代方案。
while read line
do
in=${line/ */}
pat=${line/* /}
echo $line ${in/$pat}
done < aba.dat
ab a b
cd d c
efg ef g
- 在
in
replace (/
) from $line 中,什么是空白,后跟一些东西——不是正则表达式,而是通配符风格。 - 与之
pat
相反:删除空白之前的内容。删除,因为${src/pattern/replacement}的替换部分是空白的。 - ${in/$pat} 将
pat
in替换in
为空。$
与第一个变量/部分 (in) 相比,pat var 需要标记为变量。