Y发生X次后AWK拆分文件

时间:2016-09-12 10:26:28

标签: shell awk

我正在尝试将一个大文件拆分成多个文件。如果“标签”被发现1000次。

这可以工作,但为每个标签写一个新文件。我应该如何摆放柜台?

awk '{print $0 RS > NR ".txt" ; close(NR".txt") }' RS="</tag>" big_file.txt

例如:

标签&GT;
 bla1
 blub
/标签&GT;

标签&GT;
 bla2
 blub
/标签&GT;

标签&GT;
 bla3
 blub
/标签&GT;

标签&GT;
 bla4
 blub
/标签&GT;

标签&GT;
 bla5
 blub
/标签&GT;

标签&GT;
 bla6
 blub
/标签&GT;

我想要的是什么:

文件1: 标签&GT;
 bla1
 blub
/标签&GT;
标签&GT;
 bla2
 blub
/标签&GT;
标签&GT;
 bla3
 blub
/标签&GT;

文件2: 标签&GT;
 bla4
 blub
/标签&GT;
标签&GT;
 bla5
 blub
/标签&GT;
标签&GT;
 bla6
 blub
/标签&GT;

等等

非常感谢

2 个答案:

答案 0 :(得分:2)

你的命令

awk '{print $0 RS > NR ".txt" ; close(NR".txt") }' RS="</tag>" big_file.txt

与我的awk版本不同(我使用mawk 1.3.3)。而不是将 big_file.txt 拆分为每个模式的许多文件

tag>
...
/tag>

它将 big_file.txt 的整个上下文写入文件 1.txt

但是为了解决您的问题,您可以尝试使用 sprintf 功能。对我来说,以下命令有效:

awk 'num = 2 { file = sprintf("small_file%s.txt", int(delim / num)); print > file; } /^\/tag>$/ { delim++ }'   < big_file.txt

此处变量 num 是所需的出现次数。

答案 1 :(得分:1)

我不能宽容地使用</tag>来获取RS的值(RS只有在单个字符时才能很好地定义,或者为空,尽管在某些实现中它可能更长。但更重要的是,解析xml这种方式非常脆弱),但是如果你有一个解决方案,你喜欢使用NR为每条记录写一个新文件,你可以简单地用NR替换int(NR/1000)来获得你想要的行为