删除仅包含不同列的重复行

时间:2018-04-10 21:47:18

标签: shell awk duplicates

我有一个文件如下:

ENSG00000087266:I10_35  chr4:2815905-2816105    +   I   B
ENSG00000087266:I10_35  chr4:2815905-2816105    +   I   U
ENSG00000087266:I10_36  chr4:2815955-2816155    +   I   B
ENSG00000087266:I10_36  chr4:2815955-2816155    +   I   U
ENSG00000087266:I16_18  chr4:2826151-2826351    +   I   B
ENSG00000087266:I3_27   chr4:2797290-2797490    +   I   B
ENSG00000087266:I3_28   chr4:2797340-2797540    +   I   B
ENSG00000087266:I3_28   chr4:2797340-2797540    +   I   U
ENSG00000087266:I3_29   chr4:2797390-2797590    +   I   B
ENSG00000087266:I3_30   chr4:2797440-2797640    +   I   B
ENSG00000087266:I3_30   chr4:2797440-2797640    +   I   U
ENSG00000087266:I3_31   chr4:2797490-2797690    +   I   B
ENSG00000087266:I3_38   chr4:2797840-2798040    +   I   B
ENSG00000000003:E1_1    chrX:99894942-99895142  -   E   U
ENSG00000000003:E2_10   chrX:99891638-99891838  -   E   U
ENSG00000000003:E2_11   chrX:99891688-99891888  -   E   U
ENSG00000000003:E2_12   chrX:99891738-99891938  -   E   U
ENSG00000000003:E2_13   chrX:99891788-99891988  -   E   U
ENSG00000000003:E2_14   chrX:99891838-99892038  -   E   U
ENSG00000000003:E2_15   chrX:99891888-99892088  -   E   U
ENSG00000000003:E2_16   chrX:99891938-99892138  -   E   U
ENSG00000000003:E2_1    chrX:99891188-99891388  -   E   U
ENSG00000000003:E2_2    chrX:99891238-99891438  -   E   U

我想删除第5列中包含“U”的所有重复列,以便文件

ENSG00000087266:I10_35  chr4:2815905-2816105    +   I   B
ENSG00000087266:I10_36  chr4:2815955-2816155    +   I   B
ENSG00000087266:I16_18  chr4:2826151-2826351    +   I   B
ENSG00000087266:I3_27   chr4:2797290-2797490    +   I   B
ENSG00000087266:I3_28   chr4:2797340-2797540    +   I   B
ENSG00000087266:I3_29   chr4:2797390-2797590    +   I   B
ENSG00000087266:I3_30   chr4:2797440-2797640    +   I   B
ENSG00000087266:I3_31   chr4:2797490-2797690    +   I   B
ENSG00000087266:I3_38   chr4:2797840-2798040    +   I   B
ENSG00000000003:E1_1    chrX:99894942-99895142  -   E   U
ENSG00000000003:E2_10   chrX:99891638-99891838  -   E   U
ENSG00000000003:E2_11   chrX:99891688-99891888  -   E   U
ENSG00000000003:E2_12   chrX:99891738-99891938  -   E   U
ENSG00000000003:E2_13   chrX:99891788-99891988  -   E   U
ENSG00000000003:E2_14   chrX:99891838-99892038  -   E   U
ENSG00000000003:E2_15   chrX:99891888-99892088  -   E   U
ENSG00000000003:E2_16   chrX:99891938-99892138  -   E   U
ENSG00000000003:E2_1    chrX:99891188-99891388  -   E   U
ENSG00000000003:E2_2    chrX:99891238-99891438  -   E   U

简而言之,如果除了最后一列之外的所有列的行都是重复的,请保留以'B'结尾的行并删除以'U'结尾的副本

到目前为止,我已尝试使用

  while read id; do  sed -i '/"$id"/{/U/d}' file_that_contains_duplicates.txt; done < list_of_duplicate_ids.txt 

没有输出任何东西;  目前我正在运行

 while read id; do  awk -v id=$id '$1!=id && $5!="U"' file_that_contains_duplicates.txt; done < list_of_duplicate_ids.txt | sort -u which somehow works but outputs repeated lines and also takes some time.

2 个答案:

答案 0 :(得分:1)

$ awk '!(seen[$1,$2,$3,$4]++ && ($5 == "U"))' file
ENSG00000087266:I10_35  chr4:2815905-2816105    +   I   B
ENSG00000087266:I10_36  chr4:2815955-2816155    +   I   B
ENSG00000087266:I16_18  chr4:2826151-2826351    +   I   B
ENSG00000087266:I3_27   chr4:2797290-2797490    +   I   B
ENSG00000087266:I3_28   chr4:2797340-2797540    +   I   B
ENSG00000087266:I3_29   chr4:2797390-2797590    +   I   B
ENSG00000087266:I3_30   chr4:2797440-2797640    +   I   B
ENSG00000087266:I3_31   chr4:2797490-2797690    +   I   B
ENSG00000087266:I3_38   chr4:2797840-2798040    +   I   B
ENSG00000000003:E1_1    chrX:99894942-99895142  -   E   U
ENSG00000000003:E2_10   chrX:99891638-99891838  -   E   U
ENSG00000000003:E2_11   chrX:99891688-99891888  -   E   U
ENSG00000000003:E2_12   chrX:99891738-99891938  -   E   U
ENSG00000000003:E2_13   chrX:99891788-99891988  -   E   U
ENSG00000000003:E2_14   chrX:99891838-99892038  -   E   U
ENSG00000000003:E2_15   chrX:99891888-99892088  -   E   U
ENSG00000000003:E2_16   chrX:99891938-99892138  -   E   U
ENSG00000000003:E2_1    chrX:99891188-99891388  -   E   U
ENSG00000000003:E2_2    chrX:99891238-99891438  -   E   U

答案 1 :(得分:0)

在这种情况下,我不知道“重复”是什么意思,因为你只是删除所有以“D”结尾的行。那是easily done

sed '/U$/d'

(匹配以“U”结尾的行,然后 d elete。)

如果您只想要以“B”结尾的行:

sed -n '/B$/p'

(匹配以“B”结尾的行,然后 p rint。)