我有一个标签分隔文件,如下所示:
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”命令,但我不确定如何在所有行的搜索模式不一样的情况下使用它。
答案 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