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 回答