awk - 按条件将一个.txt文件分隔到文件中

时间:2015-02-16 13:13:16

标签: file awk split

我有一个问题,我想按条件将一个文件分成更多文件。 INPUT:一个文本文件

variable chrom=chr1
1000 10
1010 20
1020 10
vriable chrom=chr2
1000 20
1100 30
1200 10

OUTPUT:此示例的两个文件。

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})=>开始,则为分隔符条件与其他文本文件分开。 谢谢

2 个答案:

答案 0 :(得分:2)

这些方面的东西:

awk 'BEGIN { filename="unknown.txt" } /^variable chrom=/ { close(filename); filename = substr($0, index($0, "=") + 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($0, index($0, "=") + 1) ".txt"  filename
}
{ print > filename }               # print everything to the current file.

基本算法非常简单:按行读取文件,当找到启动新部分的行时更改文件名,始终将当前行打印到当前文件,因此恶魔详细说明了文件名与标记线。在

filename = substr($0, index($0, "=") + 1) ".txt"
对于您展示的示例,

方法过于简单但可维护:它需要=之后的所有内容并附加.txt来获取文件名。如果您的标记线比variable chrom=filenamestub更复杂,则必须对其进行修改,但在这种情况下,我只能猜测您的要求并且可能会猜错。

答案 1 :(得分:1)

如果你知道它们之间有多少行,你可以使用

split -l 4 textfile.txt

这将在找到的第4行分割文本文件,生成文件xaaxab,依此类推。