LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1181|回复: 6

[请教]如何按每行前两个字符(或某字段)拆分文本文件?

[复制链接]
发表于 2006-2-7 14:59:02 | 显示全部楼层 |阅读模式
现有一个已经按第一个字段排序的文本文件infile,内容如下:
1101 x y z
1101 a b c
1101 x y z
1204 r s t
1205 a b c
2100 x y z
2100 x x y
...
...

现欲写一脚本,根据infile文件每行的前两个字符,生成若干个文本文件:
文件out11,内容为infile中以11开头的行
文件out12,内容为infile中以12开头的行
文件out21,内容为infile中以21开头的行
...
...

请教这个脚本如何写?谢谢!
发表于 2006-2-7 17:12:23 | 显示全部楼层
#!/bin/sh
KEYWORD1=$1
KEYWORD2=$2
FILE=$3
grep ^[$KEYWORD1][$KEYWORD2] $FILE > out$KEYWORD1$KEYWORD2

保存一个可执行文件比如cut
执行./cut 1 1 infile
就可以生成out11的文件!依次类推!
回复 支持 反对

使用道具 举报

发表于 2006-2-7 22:41:43 | 显示全部楼层
play with awk:

[PHP]sh-2.05b$ awk 'BEGIN{FS=""} {print $0 >>out$1$2 }' infile
sh-2.05b$ ls
11  12  21  infile
sh-2.05b$ cat ??
1101 x y z
1101 a b c
1101 x y z
1204 r s t
1205 a b c
2100 x y z
2100 x x y
sh-2.05b$[/PHP]
回复 支持 反对

使用道具 举报

发表于 2006-2-8 00:55:51 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-8 14:05:48 | 显示全部楼层
Post by linux_now
play with awk:

[PHP]sh-2.05b$ awk 'BEGIN{FS=""} {print $0 >>out$1$2 }' infile
sh-2.05b$ ls
11  12  21  infile
sh-2.05b$ cat ??
1101 x y z
1101 a b c
1101 x y z
1204 r s t
1205 a b c
2100 x y z
2100 x x y
sh-2.05b$[/PHP]


谢谢!我就是想找这样一个方法。

不过不知道是不是我的awk版本的问题,我按你的方法运行了一下,发现$1的内容是和$0完全一致的,也就是我的awk把FS=""理解成了没有分隔符!

我用的是HP-UX上的某种awk……

继续想办法
回复 支持 反对

使用道具 举报

发表于 2006-2-8 16:20:27 | 显示全部楼层
我也在学用awk,可能是板本的差异,上面是用debian的mawk做的
现在用gawk结果是一样的
[HTML]
[16:18:07 test]$  awk 'BEGIN{FS=""} {print $0 >>out$1$2 }' infile
[16:18:27 test]$ ls
11  12  21  infile
[16:18:29 test]$ cat ??
1101 x y z
1101 a b c
1101 x y z
1204 r s t
1205 a b c
2100 x y z
2100 x x y
[16:18:36 test]$
[/HTML]
回复 支持 反对

使用道具 举报

发表于 2006-2-9 09:50:01 | 显示全部楼层
FS=""是单个字符为一字段吗?为什么我的$0和$1也是一样的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表