enter code here
我想在每条记录中删除密钥的重复实例(前2个字段)。根据我的具体情况,副本实际上显示为反转。
所以给出
a b b a stuff1 b a stuff2 stuff3 b a
其中每个空格都是一个标签
我想:
a b stuff1 stuff2 stuff3
我认为这样做会:
awk 'BEGIN {FS=OFS="\t"}
{gsub($2 "\t" $1,"")}
1' file
欢迎替代解决方案,但我特别感兴趣的是为什么不起作用
(我尝试使用动态正则表达式和gensub
btw)。
根据上一个问题,我知道我可能/最终会使用重复的标签,并将在awk
之外处理。
修改
到目前为止,解决方案并不起作用,因此这里是真实的数据。对于^读取制表符
1874 ^Passage de Venus^ <DIRECTORS> ^Passage de Venus^ 1874^ Janssen, P.J.C.^ <keywords>^ Passage de Venus^ 1874^ astronomy^ astrophotography^ <genres>^ Short
我想要的是
1874^ Passage de Venus^ <DIRECTORS>^ Janssen, P.J.C.^ <keywords>^ astronomy^ astrophotography^ <genres>^ Short
答案 0 :(得分:4)
您的尝试很好,您可能在使用spaaces / tabs时遇到一些问题。此外,您可能希望使用FS
使其更具可变性:
awk 'BEGIN {FS=OFS="\t"} {gsub($2 FS $1, "")}1' file
|____________________^
因此,如果您注意到字段分隔符是另一个,只需在BEGIN
块中更改它,它就可以正常工作。
$ cat a
a b b a stuff1 b a stuff2 stuff3 b a
$ awk '{gsub($2 FS $1, "")}1' a
a b stuff1 stuff2 stuff3
答案 1 :(得分:2)
你可以试试这个
awk '{gsub($2 "[[:space:]]+" $1, "")}1' file
如果这样做并且使用"\t"
,则可能没有使用标签。
再次检查没有错误,您可能只是在选项卡旁边的文件中有空格
尝试
awk 'BEGIN{FS=" *\t *"}{gsub($2 FS $1, "")}1' file
虽然这个答案纯粹是为了解决gsub无法正常工作的原因,但我已经决定在评论中添加Eds关注的这个附录
这会停止除$2
之外的其他字词,然后匹配$1
,并且还应该排除格式混乱
awk 'BEGIN{FS=" *\t *"}{$0=gensub("("FS")" $2 FS $1 "("FS")","\\1","g")}1' file
Input
1234 mal mal 1234 formal 12345678 blah
Output
1234 mal formal 12345678 blah
即使使用metachars,这应该会更强大
awk -F' *\t *' '{x=y;for(i=1;i<=NF;i++)(i>2&&$i==$2&&$(i+1)==$1&&i++)||x=x?x"\t"$i:$i;$0=x}1' file
答案 2 :(得分:1)
这是您真正需要的解决方案,因为它在完整字段上进行字符串比较,因此当字段包含RE元字符或字段以$ 1 / $ 2的相同值开头或结尾时不会错误匹配:
awk -F' *\t *' -v OFS='\t' '{
rec = $1 OFS $2
for (i=3; i<=NF; i++) {
if ( ($i == $2) && ($(i+1) == $1) ) {
i += 2
}
else {
rec = rec OFS $i
}
}
print rec
}
' file
如果您关心的是解决方案是否健全,那么它是未经测试的 - 请测试自己并按摩以适应....
答案 3 :(得分:0)
我能想到的唯一问题是你的输入文件没有用标签分隔
<强>测试强>
$ echo "a b b a stuff1 b a stuff2 stuff3 b a" | awk '{gsub($2" "$1,"")}1'
a b stuff1 stuff2 stuff3