基于变量拆分文件

时间:2011-08-13 06:50:40

标签: sed split awk grep

我有一个包含以下几行的文件:

DELIMITER ;

我想为每个部分创建一个单独的文件。 split命令的手册页似乎没有这样的选项。

1 个答案:

答案 0 :(得分:3)

split命令只将文件拆分为相同大小的块(可能除了最后一个) 但是,awk非常适合您的问题类型。这是一个解决方案示例。

示例输入

1
2
3
DELIMITER ;
4
5
6
7
DELIMITER ;
8
9
10
11

awk脚本split.awk

#!/usr/bin/awk -f
BEGIN {
  n = 1;
  outfile = n;
}
{
  # FILENAME is undefined inside the BEGIN block
  if (outfile == n) {
    outfile = FILENAME n;
  }
  if ($0 ~ /DELIMITER ;/) {
    n++;
    outfile = FILENAME n;
  } else {
    print $0 >> outfile;
  }
}

正如glenn jackman所指出的,代码也可以写成:

#!/usr/bin/awk -f
BEGIN {
  n = 1;
}
$0 ~ /DELIMITER ;/ {
  n++;
  next;
}
{
  print $0 >> FILENAME n;
}

如果您不经常使用脚本,则命令提示符awk -v x="DELIMITER ;" -v n=1 '$0 ~ x {n++; next} {print > FILENAME n}'上的表示法更合适,但您也可以将其保存在文件中。

试运行

$ ls input*
input
$ chmod +x split.awk
$ ./split.awk input
$ ls input*
input  input1  input2  input3
$ cat input1
1
2
3
$ cat input2
4
5
6
7
$ cat input3
8
9
10
11

脚本只是一个起点。您可能必须根据个人需求和环境进行调整。