【问题标题】:Awk - Separate one .txt file to files by conditionawk - 按条件将一个 .txt 文件分隔为文件
【发布时间】:2015-04-17 00:15:45
【问题描述】:

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

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

【问题讨论】:

标签: file awk split


【解决方案1】:

类似的东西:

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 更复杂,则必须对其进行修改,但在这种情况下,我只能猜测您的要求,并且可能会猜错。

【讨论】:

    【解决方案2】:

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

    split -l 4 textfile.txt

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多