从具有多次出现列的行中提取信息

时间:2016-09-22 08:46:40

标签: awk duplicates

我有一个文件:

chr1 1234 2345 EG1234:E1
chr1 2350 2673 EG1234:E2
chr1 2673 2700 EG1234:E2
chr1 2700 2780 EG1234:E2
chr2 5672 5700 EG2345:E1
chr2 5705 5890 EG2345:E2
chr2 6000 6010 EG2345:E3
chr2 6010 6020 EG2345:E3

正如您所看到的,在'之前有一个特定的ID:'并且有一个ID在'之后重复:'这可能是多行的共同点,我想要一个看起来像这样的输出:

chr1 1234 2345 EG1234:E1 (output as it is since it doesn't have duplicate id in the next row)
chr1 2350 2780 EG1234:E2 (since duplicate the 1st and 2nd column of 1st occurrence & 
3rd and 4 th column of the last occurence) 
similarly
  chr2 5672 5700 EG2345:E1
  chr2 5705 5890 EG2345:E2
  chr2 6000 6020 EG2345:E3

我试图使用一个键移动到下一列,但我不确定如何提取列明智的值

 awk '{key=$4; if (!(key in data)) c[++n]=key; data[key]=$0} END{for (i=1; i<=n; i++) print data[c[i]]}' file1

简而言之,我想提取第一次出现的前两列和最后一次出现的具有重复第4列的任何行的最后两列

2 个答案:

答案 0 :(得分:2)

这个只会弄乱记录顺序:

($1 FS $4 in a) {                            # combination of $1 and $4 is the key
    split(a[$1 FS $4],b)                     # split to get the old $2
    a[$1 FS $4]=b[1] FS b[2] FS $3 FS b[4]   # update $3
    next
}
{
    a[$1 FS $4]=$0                           # new key found
}
END {
    for(i in a)                              # print them all
        print a[i]
}

测试它:

$ awk -f foo.awk foo.txt
chr1 EG1234:E2 2350 2780
chr2 EG2345:E1 5672 5700
chr2 EG2345:E2 5705 5890
chr2 EG2345:E3 6000 6020
chr1 EG1234:E1 1234 2345

一衬垫:

$ awk '($1 FS $4 in a) {split(a[$1 FS $4],b); a[$1 FS $4]=b[1] FS b[2] FS $3 FS b[4]; next} {a[$1 FS $4]=$0} END {for(i in a) print a[i]}' foo.txt

答案 1 :(得分:1)

使用awk,将key1:key2视为唯一组合,并将其应用于过滤重复项。此处$4代表您文件中的key1:key2

awk '!seen[$4]++' file

chr1 1234 2345 EG1234:E1
chr1 2350 2673 EG1234:E2
chr2 5672 5700 EG2345:E1
chr2 5705 5890 EG2345:E2
chr2 6000 6010 EG2345:E3

逻辑是直截了当的,key1:key2标识的行只有在没有看到的情况下才会打印出来。