awk之close函数

400阅读 0评论2015-10-22 sync_1521
分类:LINUX

问题由来:
需要处理文本的内容......
3105enter PvE map|30|2015-10-20 17:41:16.919|3105|enter PvE map|3|49|2|7|13089807419000|200011104|
1105UseSkill|31|2015-10-20 17:41:23.454|1105|UseSkill|3|49|2|7|13089807419000|200011104|
1105UseSkill|32|2015-10-20 17:41:24.537|1105|UseSkill|3|49|2|7|13089807419000|200011104|
1105UseSkill|33|2015-10-20 17:41:28.524|1105|UseSkill|3|49|2|7|13089807419000|200011104|
2204SaveEquipInfoSub|24|2015-10-20 17:41:16.919|2204|SaveEquipInfoSub|3|49|2|7|13089807419000|200011104|
2204SaveEquipInfoSub|25|2015-10-20 17:41:16.919|2204|SaveEquipInfoSub|3|49|2|7|13089807419000|200011104|
......

需要按 | 分割并根据第一个字段拆分文件比如 
3105enter PvE map 的拆分到  3105enter PvE map 文件
1105UseSkill 的拆分到1105UseSkill 
2204SaveEquipInfoSub 的拆分到2204SaveEquipInfoSub

我用awk报错了,这个怎么破 
  1. $ awk -F'|' '{print > $1}' file.log
  2. awk: 1011dead makes too many open files
  3. input record number 112, file file.log
  4. source line number 1
复制代码

close函数说明
close( Expression ) 用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的。


那么上面的问题
awk -F'|' '{print >> $1;close($1)}' file.log
似乎是一个很好的解法

但是有大神给出了更好的解法:
先用sort将文件排序,然后 
  1. awk -F'|' 'NR>1&&s!=$1{close(s)}{print > $1;s=$1}' file.log

这种写法秒在可以避免频繁打开关闭文件,soga!!

另外需要关注到的一点是操作系统打开的文件数限制由ulimit里面的open file决定。
clouder@server4-120:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 62168
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 4096
cpu time               (seconds, -t) unlimited
max user processes              (-u) 655350
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
clouder@server4-120:~$ 
上一篇:awk初学之常见问题(ss精华帖)
下一篇:awk: warning: escape sequence `\&