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 行拆分文本文件,生成文件 xaaxab,依此类推。