Unix 分割文件或提取基于图案不同的行
我有一个选项卡分隔的文件,如下所示:Unix 分割文件或提取基于图案不同的行,unix,sed,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 S
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”命令,但我不确定当搜索模式对所有行都不相同时如何使用它。单向使用
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
==>Supercontig_1.1 Supercontig_1.2 Supercontig_1.3这可能适合您(GNU-sed):
仅当文件已排序时,此操作才起作用
如果文件未排序,请使用:
sort -u -k1,1 file | sed -r 's#^(\S*).*#/^\1/w\1#' | sed -nf - file
你说得对。我有一个标签分开的文件。修正了错误。我可以写“\t”作为分隔符吗?如何将输出分成单独的文件?@Jon:AWk
默认情况下,使用任何空格字符分割字段,包括制表符。当分隔符是不同的字符(如逗号)时,您只需更改FS
的值。顺便问一下,如何使输出文件以制表符分隔?我试着使用几个版本的FS=“\t”,但后来我把每一行都打印到了标准输出中。@Jon:输入文件中的字段是如何分隔的?只有空格、制表符、混合?@Jon:那么字段也将在输出中以制表符分隔,因为脚本打印行而不修改它($0
)。你测试过了吗?
sort -u -k1,1 file | sed -r 's#^(\S*).*#/^\1/w\1#' | sed -nf - file