拆分文件或提取基于模式不同的行

时间:2012-10-16 07:38:11

标签: unix sed

我有一个标签分隔文件,如下所示:

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”命令,但我不确定如何在所有行的搜索模式不一样的情况下使用它。

2 个答案:

答案 0 :(得分: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=","; }

答案 1 :(得分: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