我正在尝试在多个块中均匀地分割文件。这是我的代码:
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个文件。我以前两个为例。
答案 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。