根据变量分割文件

发布于 2024-11-29 12:37:39 字数 110 浏览 1 评论 0原文

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

DELIMITER ;

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

I have a file with several lines of the following:

DELIMITER ;

I want to create a separate file for each of these sections.
The man page of split command does not seem to have such option.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱人如己 2024-12-06 12:37:39

split 命令仅将文件分割成大小相等的块(可能除了最后一个)。
然而,awk 非常适合您的问题类型。这是一个解决方案示例。

输入 awk 脚本示例

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

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 -vx="DELIMITER ;" -vn=1 '$0 ~ x {n++;下一个} {打印>如果您不经常使用该脚本,则 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

该脚本只是一个起点。您可能必须使其适应您的个人需求和环境。

The split command only splits a file into blocks of equal size (maybe except for the last one).
However, awk is perfect for your type of problem. Here's a solution example.

Sample input

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

awk script 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;
  }
}

As pointed out by glenn jackman, the code also can be written as:

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

The notation on the command prompt awk -v x="DELIMITER ;" -v n=1 '$0 ~ x {n++; next} {print > FILENAME n}' is more suitable if you don't use the script more often, however you can also save it in a file as well.

Test run

$ 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

The script is just a starting point. You probably have to adapt it to your personal needs and environment.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文