4

このようなタブ区切りのファイルがあります

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     

column4 の値が繰り返される行を削除する必要があります。

最初の 3 つの列は座標であり、それらの座標には、見つかったものはすべて (col4 に) リストされています。各座標には、名前の繰り返しではなく、一意の名前のみを付けたいと考えています。

このような出力が欲しい

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 

私が試したこと

sort -k 4 -u file

awk '{if($4==temp1){next;}else{print}temp1=$4}' file

何も機能しません:(

助けてください

ありがとうございました

4

7 に答える 7

4

あなただけが必要です

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

編集:新しい入力を処理する

awk '{
    if (NF == 1) 
        value = $1
    else {
        key =  $1 SUBSEP $2 SUBSEP $3
        value = $4
    }
    if ((key SUBSEP value) in val) 
        next
    print
    val[key, value] = 1
}' input
于 2012-11-19T17:59:42.123 に答える
2
sed '1{x;d};H;x;s/\([ ][^\n ]*\)[ ]*\n[ ]*\1[ ]*\n/\1\n/;$p;x;d;$p;x;d' FILE

ファイルにスペース以外のタブがある場合は、すべて[ ]を。に置き換えることができます[[:space:]]

于 2012-11-19T17:30:11.003 に答える
1

おそらく、次のことが役立ちます。

use strict;
use warnings;

my %seen;

while (<DATA>) {
    my ($col3) = (split)[-1];
    print if !$seen{$col3}++ or !$col3;
}

__DATA__
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

出力:

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

この出力は、次のワンライナーでも実現できます。

perl -ane "print if !$X{$F[-1]}++ or !$F[-1]" data.txt
于 2012-11-19T17:41:31.457 に答える
1

小さなperlスクリプトを使用する:

perl -e 'my $col4 = "";
while (<>) {
  chomp;
  my @f = split(/\t/, $_);
  if ($f[3] eq "" || $f[3] ne $col4) {
    print $_, "\n";
  }
  $col4 = $f[3];
}' 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
于 2012-11-19T15:03:12.280 に答える
1

簡単なawkスクリプト

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

クリーニング

ファイルを準備するためにinput.txt、質問からテキストをコピーしました。しかし、スペースをタブに置き換える必要がありました。したがって、sedコマンドを使用しました。また、いくつかの末尾のスペース (行末) に気付きました。最後に、次のsedコマンドを使用して入力ファイルを消去しました。

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

@dogbane コメントからの入力ファイル

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

MRTO4now!で終わる 1 行があることに注意してください。

于 2012-11-19T15:42:11.603 に答える
1

新しく投稿された入力を考えると、次を使用します。

gawk -F'\t' '!/^\t/{delete a} !a[$4]++' file

私は gawk を使用しているので、一度に配列全体を明確に削除できます。他の awk ではあまり明確でないものを使用します。

awk -F'\t' '!/^\t/{split("",a)} !a[$4]++' file
于 2012-11-20T15:47:57.103 に答える
0

繰り返される行が 4 列目だけでなくすべての列で重複している場合は、おそらく uniq(1) が適しています。実行してみてuniq file、出力が期待どおりかどうかを確認してください。

于 2012-11-19T15:02:01.300 に答える