删除las中具有重复值的行

2024-09-29 19:23:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个制表符分隔的文件,如下所示

chr1  12226559  12227059  TNFRSF1B       
chr1  17051560  17052060                 
chr1  17053279  17053779                 
chr1  17338423  17338923  ATP13A2        
                          ATP13A2        
                          ATP13A2        
chr1  19577574  19578074  EMC1           
                          MRTO4          
chr1  19578046  19578546  EMC1           
                          MRTO4          
chr1  19638239  19638739  AKR7A2         
                          PQLC2          
                          PQLC2          
                          PQLC2
                          AKR7A2         
                          PQLC2     

我希望列4的值重复的行应该被删除。在

前三列是坐标,在这些坐标中,我们找到的东西都列出来了(在col4中),对于每个坐标,我只想有唯一的名称,而不是重复的名称。在

我想要这样的输出

^{pr2}$

我尝试过的东西

^{3}$

什么都不管用:(

请帮忙

谢谢你


Tags: 文件名称制表符chr1pr2col4emc1mrto4
3条回答
sed '1{x;d};H;x;s/\([ ][^\n ]*\)[ ]*\n[ ]*\1[ ]*\n/\1\n/;$p;x;d;$p;x;d' FILE

如果文件中除了空格之外还有制表符,则可以将所有[ ]替换为[[:space:]]。在

简单awk脚本

awk -F'\t' '{OFS="\t"; if ($4=="" || $4!=old) print; old=$4}' input.txt

结果

^{pr2}$

清洁

为了准备我的input.txt文件,我复制了问题中的文本。但我不得不用制表符代替空格。因此我使用了sed命令。我还注意到一些尾随空格(在行尾)。最后,我使用以下sed命令来清理输入文件:

sed 's/ *$//;/^[^ ]/s/  */\t/g;/^ /s/  */\t\t\t/g;' copy-fron-so.txt > input.txt

来自@dogbane comment的输入文件

chr1  12226559  12227059  TNFRSF1B
chr1  17051560  17052060
chr1  17053279  17053779
chr1  17338423  17338923  ATP13A2
                          ATP13A2
                          ATP13A2
chr1  19577574  19578074  EMC1
                          MRTO4
chr1  19578046  19578546  EMC1
                          MRTO4
chr1  19638239  19638739  AKR7A2
                          PQLC2
                          PQLC2
                          PQLC2
                          AKR7A2

(最后一行已追加)

清洁和加工

$> sed 's/ *$//;/^[^ ]/s/  */\t/g;/^ /s/  */\t\t\t/g;' copypaste.txt > input.txt
$> awk -F'\t' '{OFS="\t"; if ($4=="" || $4!=old) print; old=$4}' input.txt
chr1    12226559        12227059        TNFRSF1B
chr1    17051560        17052060
chr1    17053279        17053779
chr1    17338423        17338923        ATP13A2
chr1    19577574        19578074        EMC1
                                        MRTO4
chr1    19578046        19578546        EMC1
                                        MRTO4
chr1    19638239        19638739        AKR7A2
                                        PQLC2
                                        AKR7A2

需求变更

不应打印具有AKR7A2的最后一行。因此,我们需要首先对input.txt文件进行排序。注意:选项-t用于引入一个制表符,在bashvi上按[CTRL-V],然后[TAB](在该选项卡周围加引号)。在

$> LANG=C sort -k 4 -s -t ' ' input.txt > sorted.txt 
$> awk -F'\t' '{OFS="\t"; if ($4=="" || $4!=old) print; old=$4}' sorted.txt
chr1    17051560        17052060
chr1    17053279        17053779
chr1    19638239        19638739        AKR7A2
chr1    17338423        17338923        ATP13A2
chr1    19577574        19578074        EMC1
                                        MRTO4
                                        PQLC2
chr1    12226559        12227059        TNFRSF1B

注意,现在有一行以MRTO4结尾!在

你只需要

awk '$NF != prev {print} {prev=$NF}'

编辑:处理新输入

^{pr2}$

相关问题 更多 >

    热门问题