使用分隔符awk将文件拆分为多个

时间:2016-04-11 02:10:22

标签: file awk split

我正在尝试在多个块中均匀地分割文件。这是我的代码:

awk '/*/ { delim++ } { file = sprintf("splits/audio%s.txt", int(delim /2)); print >> file; }' < input_file

我的文件如下:

"*/audio1.lab"
0 6200000 a
6200000 7600000 b
7600000 8200000 c
.
"*/audio2.lab"
0 6300000 a
6300000 8300000 w
8300000 8600000 e
8600000 10600000 d
.

它给了我一个错误:awk:第1行:语法错误在或附近* 我不太了解awk理解这个错误。我试过逃避角色,但仍然无法弄明白。我可以在python中编写脚本,但我想学习如何在awk中执行此操作。任何一个人都知道我做错了什么?

编辑:我有14021个文件。我以前两个为例。

2 个答案:

答案 0 :(得分:1)

首先,你的正则表达是非法的; '*'表示匹配前一个字符0次或更多次,但没有先前的字符。

目前还不完全清楚你要做什么,但看起来当你遇到一个带星号的线时你想要撞击文件号。要匹配星号,您需要将其转义:

awk '/\*/ { close(file); delim++ } { file = sprintf("splits/audio%d.txt", int(delim /2)); print >> file; }' < input_file

另请注意%d是来自int的十进制输出的正确格式字符。

答案 1 :(得分:1)

idk关于这个问题的所有其他内容是什么,但只是将您的输入文件拆分为单独的输出文件,您只需要:

awk '/\*/{close(out); out="splits/audio"++c".txt"} {print > out}' file

由于“重复”元字符(例如*?+)在正则表达式中的第一个字符时可以采用字面意义,因此正则表达式/*/将会在一些(例如gawk)中工作得很好但不是所有的awk,因为你显然有太多文件打开的问题你不能使用gawk(为你管理文件)所以你可能需要逃避{{1}完成写入后,每个输出文件和*。没有伤害这样做,它使脚本可移植到所有awks。