需要处理文本的内容......
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报错了,这个怎么破
close函数说明
close( Expression ) | 用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的。 |
那么上面的问题
awk -F'|' '{print >> $1;close($1)}' file.log
似乎是一个很好的解法
但是有大神给出了更好的解法:
先用sort将文件排序,然后
- 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:~$