Awk - 根据条件将一个 .txt 文件分隔为多个文件
Awk - Separate one .txt file to files by condition
我有一个问题,我想按条件将一个文件分成多个文件。
输入:一个文本文件
variable chrom=chr1
1000 10
1010 20
1020 10
vriable chrom=chr2
1000 20
1100 30
1200 10
输出:此示例的两个文件。
chr1.txt
variable chrom=chr1
1000 10
1010 20
1020 10
chr2.txt
variable chrom=chr2
1000 20
1100 30
1200 10
因此,如果行以 chrom=chr$i (i={1..22}) => 分隔到其他文本文件,则分隔符条件。
谢谢
大致如下:
awk 'BEGIN { filename="unknown.txt" } /^variable chrom=/ { close(filename); filename = substr([=10=], index([=10=], "=") + 1) ".txt"; } { print > filename }'
awk代码在哪里
BEGIN { filename="unknown.txt" } # default file name, used only if the
# file doesn't start with a variable chrom=
# line
/^variable chrom=/ { # in such a line:
close(filename) # close the previous file (if open)
# and set the new filename
filename = substr([=11=], index([=11=], "=") + 1) ".txt" filename
}
{ print > filename } # print everything to the current file.
基本算法非常简单:按行读取文件,找到开始新部分的行时更改文件名,始终将当前行打印到当前文件,所以问题在于隔离文件的细节来自标记线的名称。
filename = substr([=12=], index([=12=], "=") + 1) ".txt"
方法很简单,但对您展示的示例有用:它获取 =
之后的所有内容并附加 .txt
以获取文件名。如果你的标记线比variable chrom=filenamestub
更复杂,这就得修改了,但那样的话我只能猜你的要求,很可能猜错了。
如果你知道中间有多少行,你可以使用
split -l 4 textfile.txt
这将在它找到的第 4 行拆分文本文件,生成文件 xaa
和 xab
,依此类推。
我有一个问题,我想按条件将一个文件分成多个文件。 输入:一个文本文件
variable chrom=chr1
1000 10
1010 20
1020 10
vriable chrom=chr2
1000 20
1100 30
1200 10
输出:此示例的两个文件。
chr1.txt
variable chrom=chr1
1000 10
1010 20
1020 10
chr2.txt
variable chrom=chr2
1000 20
1100 30
1200 10
因此,如果行以 chrom=chr$i (i={1..22}) => 分隔到其他文本文件,则分隔符条件。 谢谢
大致如下:
awk 'BEGIN { filename="unknown.txt" } /^variable chrom=/ { close(filename); filename = substr([=10=], index([=10=], "=") + 1) ".txt"; } { print > filename }'
awk代码在哪里
BEGIN { filename="unknown.txt" } # default file name, used only if the
# file doesn't start with a variable chrom=
# line
/^variable chrom=/ { # in such a line:
close(filename) # close the previous file (if open)
# and set the new filename
filename = substr([=11=], index([=11=], "=") + 1) ".txt" filename
}
{ print > filename } # print everything to the current file.
基本算法非常简单:按行读取文件,找到开始新部分的行时更改文件名,始终将当前行打印到当前文件,所以问题在于隔离文件的细节来自标记线的名称。
filename = substr([=12=], index([=12=], "=") + 1) ".txt"
方法很简单,但对您展示的示例有用:它获取 =
之后的所有内容并附加 .txt
以获取文件名。如果你的标记线比variable chrom=filenamestub
更复杂,这就得修改了,但那样的话我只能猜你的要求,很可能猜错了。
如果你知道中间有多少行,你可以使用
split -l 4 textfile.txt
这将在它找到的第 4 行拆分文本文件,生成文件 xaa
和 xab
,依此类推。