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

Awk 从列多次出现的行中提取信息,awk,duplicates,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
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

awk'{key=$4;if(!(key in data))c[++n]=key;data[key]=$0}END{for(i=1;i使用
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
标识的行只有在尚未看到时才会打印。

使用
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
标识的行只有在尚未看到时才会打印。

这一行只会弄乱记录顺序:

($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 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

我认为我的解释不够清楚,我想从任何重复第4行的最后一次出现中提取第一次出现的前两列和最后两列column@AishwaryaKulkarni:请在您的问题中更新您预期的o/p。我认为我的解释不够清楚,我想提取第一个问题的前两列具有重复第4行的任何行的最后一个匹配项中的“匹配项”和“最后两列”column@AishwaryaKulkarni:请在您的问题中更新您预期的o/p。我在单行上写它时遇到问题,我怎么做?我写的东西类似于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[$1fs$4]=$0}END{for(a中的i)打印a[i]}'foo.txt,它在结尾处给我一个语法错误。我将在答案中添加一行。我在单行上写它有问题,我怎么能做到呢?我写的东西像awk'{($1fs$4 in a);{split a(a[$1fs$4],b)a[$1fs$4]=b[1]FS$4]=b[1]FS$b[2]FS$3fs$b[4];next}a[$1fs$4}END{for(a中的i)print a[i]}'foo.txt,它在ENDI处给了我一个语法错误。我将在答案中添加一行。