2016-04-11 228 views
0

我想在许多块中均匀分割文件。这是我的代码:用分隔符awk将文件分解为多个文件awk

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

目前尚不清楚你到底想要做什么。你想分裂文件或合并文件或其他东西?那个魔杖是输入一个文件还是两个单独的文件?澄清'我试图在多个块中均匀分割文件'。意思是在给定样本输入的情况下发布期望的输出。 –

+0

按标题拆分文件。方便的标题是“*” – badner

+0

唯一的行所以你有1个文件看起来像你的发布的输入,你想分裂成多个文件,每块一个?或者你是否试图从输入文件中获取2个块到每个输出文件(因此除以2)或其他东西?这与你有14021个文件有什么关系?你想为所有输入文件中的每个块输入独特的输出文件还是某种合并或什么?再次,更好的描述和张贴预期的输出将是一个很大的帮助。 –

回答

1

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

这并不完全清楚你想要做什么,但它看起来像当你遇到一个星号的行,你想冲击文件编号。要匹配一个星号,你需要逃避它:

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

还要注意%d是从int小数输出正确的格式字符。

+0

你是正确的大卫。当我找到一个星号时,我试图碰撞。我也尝试了你的建议,但它给了我一个不同的错误:awk:无法打开“splits/audio1021.txt”输出(太多打开文件)我有更多的文件比两个,我试图保持简单的问题。这是一个记忆问题吗? – badner

+0

这是很多文件。在你的第一个条款中,尝试如下所示:{close(file); delim ++} –

+0

完美!你先生是个巫师!我不知道关闭。这真是好东西。 – badner

1

IDK的什么都解决此问题,其他的东西是约但只拆分输入文件到单独的输出文件中的所有你需要的是:

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

这样以来*?+可以“重复”元字符当它们是正则表达式中的第一个字符时,它们具有字面含义,正则表达式/*/在某些(例如gawk)中可以正常工作,但不是所有的awks,并且由于显然存在打开太多文件的问题,因此您一定不能使用gawk(为您管理文件),因此您可能需要转义*close()每个输出文件在完成写入之后。这样做没有什么坏处,它使脚本可以移植到所有的awks中。

+1

更清洁。我考虑重写,但指出什么是破坏似乎更具启发性。 –

+0

还有一个边缘案例(常见的干净代码),其中第一个*之前的任何内容都会丢失。为了解决这个问题,'out'应该在'BEGIN'部分初始化。 –

+0

OP在第一个'*'之前没有任何行,所以我们不需要处理这个潜在的情况。如果该陈述是错误的,那么OP需要修正他的样本输入/输出,以便我们可以看到我们真正处理的是什么。 –