2

GNU sedを使用して、行に基づいてパターンを識別できますか?つまり、sed to IDを使用しているパターンに改行を挿入するにはどうすればよいですか?

たとえば、次のデータセット(実際にははるかに大きい)では、重複を検索したときに削除されるべきエラーがありますが、情報が2行でわずかに異なるためではありません(現時点では関係ありません)。 )。

この場合、元のファイルからエラーを完全に削除します。つまり、ファイル内で2行が連続している場合、rs####これらの2つのコピーと、それに続く6行を消去します。 。それらを新しいファイルに再配置するのは良いことですが、最も重要なのは、それらが元のファイルから削除されることです。

rs1038864   16  73762557    A   G
1   1633    0.5835  -0.0004 0.0035
1   1643    0.8902  0.004436    0.004354
0   0   0   0   0
rs1019567   16  83343715    G   T
rs1019567   16  83343715    G   T
1   1641    0.4692  0.0009  0.0035
1   559 0.4612  -0.0025 0.0060
1   1643    0.5178  -0.002244   0.002745
1   1643    0.5178  -0.002244   0.002745
1   1909    0.493842692 0.0008  0.0027
1   1950    0.493842692 0.0008  0.0027
rs1038556   16  55132072    C   T
1   6388    0.7773  0.0020  0.0044
1   6843    0.1161  0.001379    0.004275
1   1509    0.978660942 0.0041  0.0096
rs1019797   16  87788686    C   G
rs1019797   16  87788686    C   G
1   1639    0.717   0.0022  0.0038
1   5557    0.7193  0.0020  0.0064
1   1643    0.6691  -0.001044   0.002888
1   6843    0.6691  -0.001044   0.002888
1   1959    0.315280799 -0.0041 0.0032
1   1909    0.315280799 -0.0041 0.0032
rs1038887   16  62660698    A   G
1   1688    0.4947  -0.0028 0.0035
0   0   0   0   0
1   1909    0.464393658 0.0007  0.0028

何かのようなもの、

sed -i '/^rs.*d
^rs.*/,+6d' test.data

多分

sed -i '/^rs.*;^rs.*/,+6d' test.data

?どんな考えでもいただければ幸いです!

4

2 に答える 2

2

私はその仕事に適したツールではないと思いますsed(しかし私は間違っているかもしれません;それは削除する行が常に正確に6つあるかどうか、そしておそらく隣接するID行が常に同じIDを持っているかどうかに依存します)。あなたはおそらくそれをawkで行うことができますが、私はPerlに手を伸ばすでしょう:

#!/usr/bin/env perl
use strict;
use warnings;

my $rejects = "reject.lines";
open my $fh, '>', $rejects or die "Failed to create $rejects";

my $old = "";

while (<>)
{
    if ($_ =~ /^rs\d+ /)
    {
        if ($old =~ /^rs\d+ /)
        {
            print $fh $old;
            print $fh $_;
            while (<>)
            {
                last if /^rs\d+ /;
                print $fh $_;
            }
            $old = $_;
            next;
        }
    }
    print $old;
    $old = $_;
}
print $old if $old ne "";
close $fh;

これは、隣接するマーカー行の後の任意の数の行を処理し、2つのマーカーが同一であることに依存しません。

出力

rs1038864   16  73762557    A   G
1   1633    0.5835  -0.0004 0.0035
1   1643    0.8902  0.004436    0.004354
0   0   0   0   0
rs1038556   16  55132072    C   T
1   6388    0.7773  0.0020  0.0044
1   6843    0.1161  0.001379    0.004275
1   1509    0.978660942 0.0041  0.0096
rs1038887   16  62660698    A   G
1   1688    0.4947  -0.0028 0.0035
0   0   0   0   0
1   1909    0.464393658 0.0007  0.0028

行を拒否する

rs1019567   16  83343715    G   T
rs1019567   16  83343715    G   T
1   1641    0.4692  0.0009  0.0035
1   559 0.4612  -0.0025 0.0060
1   1643    0.5178  -0.002244   0.002745
1   1643    0.5178  -0.002244   0.002745
1   1909    0.493842692 0.0008  0.0027
1   1950    0.493842692 0.0008  0.0027
rs1019797   16  87788686    C   G
rs1019797   16  87788686    C   G
1   1639    0.717   0.0022  0.0038
1   5557    0.7193  0.0020  0.0064
1   1643    0.6691  -0.001044   0.002888
1   6843    0.6691  -0.001044   0.002888
1   1959    0.315280799 -0.0041 0.0032
1   1909    0.315280799 -0.0041 0.0032
于 2013-01-31T01:41:43.810 に答える
2

リストされた入力が含まれている場合infileは、次のようにする必要があります(GNU sed):

<infile sed -r 'N; /([^\n]+)\n\1/ { N; N; N; N; N; N; d }; P; D'

これを使用するために削除されたビットを保存したい場合deleted.txt

<infile sed -r 'N; /([^\n]+)\n\1/ { N; N; N; N; N; N; w deleted.txt
d }; P; D'

wコマンドは改行で終了する必要があることに注意してください。

説明

これにより、2番目の行がパターンスペースにロードされN()、行が重複しているかどうかがチェックされ(/([^\n]+)\n\1/)、さらに6行がパターンスペースにロードされて削除されているかどうかがチェックされます(d)。

于 2013-01-31T01:42:03.497 に答える