Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 分割文件或提取基于图案不同的行_Unix_Sed - Fatal编程技术网

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