AWK拆分文件需要关闭

时间:2014-06-12 19:05:30

标签: unix awk nawk

我有一个看起来像这样的文本文件:

valcred: requestValCred [up]
 certificate pki_001  [up]
 certificate pki_002  [up]
 certificate pki_003  [up]
 certificate pki_004  [up]
 certificate pki_005  [up]
valcred: internalValCred [up]
 certificate pki_021  [up]
 certificate pki_012  [up]
 certificate pki_103  [up]
 certificate pki_404  [up]
 certificate pki_555  [up]

我想在每次出现“valcred”时将其拆分为新的文本文件。然后,我想将所有证书放入带有所述valcred的文件中。以下是一个文件的内容。这些文件大约有100个,每个文件都有不同的条目数。发生错误时,我得到大约20个文件。

valcred: internalValCred [up]
 certificate pki_021  [up]
 certificate pki_012  [up]
 certificate pki_103  [up]
 certificate pki_404  [up]
 certificate pki_555  [up]

我正在使用此命令:

nawk '/valcred/{x="F"++i;}{print > x;}' input_file.txt  

但这是出错的地方。我遇到了这个错误:

bash-2.03$ nawk '/valcred/{x="F"++i;}{print > x;}' input_files.txt
nawk: F21 makes too many open files
 input record number 1743, file input_files.txt
 source line number 1

我以为我只需要关闭print语句。 没有什么对我有用。有人可以帮我添加一个密切的声明,使它工作吗?或者另一种解决方案?

2 个答案:

答案 0 :(得分:1)

您需要在打开新文件之前关闭输出文件。另外,我希望您要将>>附加到文件x,而不是一遍又一遍地覆盖>

nawk '/valcred/{close(x);x="F"++i;printf "" > x}{print >> x;}' input_file.txt

另请注意,我正在使用printf "" > x截断首次使用文件。

答案 1 :(得分:0)

将其放入脚本文件中,然后在要分解的文本文件上运行它。

#!/usr/bin/awk -f

BEGIN { valnum=0 }

/^valcred/ {valnum++
            close(output)
            print $0 > valnum}
/^ certificate/ { print $0 > valnum }