删除记录中的重复字段

时间:2014-12-16 09:37:32

标签: awk

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

4 个答案:

答案 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