免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2505 | 回复: 5
打印 上一主题 下一主题

如何在awk中将文件内容根据某域的值分割到不同文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-24 06:17 |只看该作者 |倒序浏览
我需要将一个文件内容按某域的值(IP地址,有250,000种可能)分别输出到不同的文件中。例如,
文件内容
1234|20.2.0.0|34323342|20000109
1234|20.2.1.0|34323342|20010110
1234|20.2.0.0|34323342|20000109
1234|10.0.0.0|34323342|20000109
1234|20.2.0.0|34323342|20000109
1234|254.3.2.1|34323342|20000109
我希望用awk把上述文件按第二域的值进行分割为
20.2.0.0.txt
1234|20.2.0.0|34323342|20000109
1234|20.2.0.0|34323342|20000109
1234|20.2.0.0|34323342|20000109
20.2.1.0.txt
1234| 20.2.1.0 |34323342|20010110
10.0.0.txt
1234|10.0.0.0|34323342|20000109
254.3.2.1.txt
1234| 254.3.2.1 |34323342|20000109

要实现上述的目的,我用如下命令
awk -F '|' '{print > $2".txt"}'
但由于第二域有250,000个不同的值,在同一个目录下存放250,000文件似乎不大可能。因此,我希望将上述文件分别放到如下目录:
"当前目录“/20/2/0/0/20.2.0.0.txt
"当前目录“/20/2/1/0/20.2.1.0.txt
"当前目录“/10/2/0/0/10.0.0.0.txt
"当前目录“/254/3/2/1/254.3.2.1.txt

我应该用怎样的命令啊?似乎我需要提前建立相应的输出目录,但awk之前,我无法知道可能的IP地址,因而无法建立相应的目录。。。另外,要达到上述目的,有没其他更高效率的方法?

谢谢。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2006-07-24 09:09 |只看该作者
建一个目录不就行了

  1. awk -F'|' '{dir=$2
  2. gsub(/\./,"/",dir);
  3. print cmd="mkdir -p "dir" &>/dev/null";
  4. system(cmd) ;close(cmd);
  5. print >>dir"/"$2".txt";close(dir"/"$2".txt")
  6. }' urfile
复制代码

论坛徽章:
0
3 [报告]
发表于 2006-07-24 09:32 |只看该作者
但这样的话,会出现在同一个目录下有250,000个目录啊。。。。。好像和一个目录下250,000个文件没多大区别啊

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
4 [报告]
发表于 2006-07-24 11:02 |只看该作者
原帖由 yacare 于 2006-7-24 09:32 发表
但这样的话,会出现在同一个目录下有250,000个目录啊。。。。。好像和一个目录下250,000个文件没多大区别啊

动手以前先别动脑,谢谢

论坛徽章:
0
5 [报告]
发表于 2006-07-24 11:35 |只看该作者
原帖由 yacare 于 2006-7-24 09:32 发表
但这样的话,会出现在同一个目录下有250,000个目录啊。。。。。好像和一个目录下250,000个文件没多大区别啊


好可爱的想法!不过建议最好按其它规律建立目录,否则四层目录也太麻烦了,比如说地址的前两个字段:

awk -F'|' '
{
split($2,addr,".");
dir=""addr[1]"."addr[2]"";cmd="mkdir -p "dir" 2>/dev/null";
system(cmd); close(cmd);
txt=""dir"/"$2".txt";
print >>txt; close(txt);
}' file

另外,向waker咨询一下,在我的SCO系统下:
print >>dir"/"$2".txt";close(dir"/"$2".txt");
好像会有语法报错,不知是否由于shell版本不同的原因:
awk: Syntax error
at line 9 of program <<
{
split($2,addr,"." ... >>
context is
        print >>>  >>dir"/" <<<
awk: illegal statement
at line 9 of program <<
{
split($2,addr,"." ... >>

论坛徽章:
0
6 [报告]
发表于 2006-07-24 11:36 |只看该作者
没动脑直接动手了:)
建目录建到31997之后就提示”too many links“,接着失败了。 相反,一个目录内是可以存放250,000个文件,但建立的速度非常慢。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP