2

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

Supercontig_1.1 400  1500  1       4
Supercontig_1.1 400  1500  2       4
Supercontig_1.1 20000  138566  1       1
Supercontig_1.1 20000  138566  2       1
Supercontig_1.2 300  1000  1       2
Supercontig_1.2 300  1000  2       2
Supercontig_1.2 1300  15000  1       2
Supercontig_1.2 1300  15000  2       2
Supercontig_1.3 0  10000  1       5
Supercontig_1.3 0  10000  2       5

そして、パターン「Supercontig_1.X」に基づくすべての行を別のファイルに抽出したいと思います。つまり、あるファイルにSupercontig_1.1が含まれるすべての行、別のファイルにSupercontig_1.2が含まれるすべての行...「sed」コマンドを調べてみましたが、検索パターンが同じでない場合の使用方法がわかりません。すべての行。

4

2 に答える 2

3

を使用した片道awk

awk '{ print $0 >$1 }' infile

これにより、次の結果が得られます。

==> Supercontig_1.1 <==
Supercontig_1.1 400  1500  1       4
Supercontig_1.1 400  1500  2       4
Supercontig_1.1 20000  138566  1       1
Supercontig_1.1 20000  138566  2       1

==> Supercontig_1.2 <==
Supercontig_1.2 300  1000  1       2
Supercontig_1.2 300  1000  2       2
Supercontig_1.2 1300  15000  1       2
Supercontig_1.2 1300  15000  2       2

==> Supercontig_1.3 <==
Supercontig_1.3 0  10000  1       5
Supercontig_1.3 0  10000  2       5

フィールドがカンマで区切られていません。スペースのみです。FSその場合は、フィールド セパレータ ( ) を次のように変更します:BEGIN { FS=","; }スクリプトの先頭。

于 2012-10-16T07:44:54.150 に答える
2

これはうまくいくかもしれません(GNU sed):

sed -r ':a;$!N;s/^((\S*)\s.*)\n\2.*/\1/;ta;s/(\S*).*/\/^\1\/w\1/;P;D' file | 
sed -nf - file

これは、ファイルがソートされている場合にのみ機能します。

ファイルがソートされていない場合は、次を使用します。

sort -u -k1,1 file | sed -r 's#^(\S*).*#/^\1/w\1#' | sed -nf - file
于 2012-10-16T08:23:27.353 に答える