LinuxSir.cn,穿越时空的Linuxsir!

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

求助!关于文本转换,现在被这个问题搞得焦头烂额的,请求大家帮助

[复制链接]
发表于 2007-7-25 21:56:44 | 显示全部楼层 |阅读模式
:ask
有以下两个文本文件a.txt和b.txt,内容如下:

[HTML]
a.txt:
1,123,aa1,aa1,        ,
2,123456,aa2,aa2,        ,
3,12456,aa3,a3,        ,
4,123456,aa4,aa4,        ,

b.txt:
1,123456,bb1,bb1,
1,123456,bb2,bb2,
1,123456,bb3,bb3,
1,123456,bb4,bb4,


现在要求在不使用awk,sed,for等命令和语句的情况下,通过shell实现把a.txt每行最后的","去掉生成aa.txt,把b.txt每行的最后加上4个"#"生成bb.txt,转换后得到的aa.txt和bb.txt内容如下:

aa.txt:

1,123,aa1,aa1,        
2,123456,aa2,aa2,        
3,12456,aa3,a3,        
4,123456,aa4,aa4,        

bb.txt:
1,123456,bb1,bb1,####
1,123456,bb2,bb2,####
1,123456,bb3,bb3,####
1,123456,bb4,bb4,####

[/HTML]
请问如何实现这个功能啊?如果能用awk,sed很容易实现,但是现在禁止使用这些命令,而且for也不能用,在此请大家帮我看一下,应该如何实现这个功能,谢谢了!
发表于 2007-7-26 10:45:59 | 显示全部楼层
(while read a ; do echo ${a%\,*} ; done)<a.txt > aa.txt
(while read b ; do echo ${b}#### ; done)<b.txt > bb.txt

这里使用了while来读取文件的内容,不知是否违规?

运行环境:
debain testing
GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
回复 支持 反对

使用道具 举报

发表于 2007-7-26 10:46:03 | 显示全部楼层
very easy

cat a.txt|cut -d, -f1-5 >aa.txt
cp b.txt bb.txt && vi -c '%s@\$@####@g' -c 'wq' bb.txt
回复 支持 反对

使用道具 举报

发表于 2007-7-26 13:59:08 | 显示全部楼层
Post by wangyb
very easy

cat a.txt|cut -d, -f1-5 >aa.txt
cp b.txt bb.txt && vi -c '%s@\$@####@g' -c 'wq' bb.txt



"vi -c '%s@\$@####@g' -c 'wq' bb.txt",能否给解释一下?没这么用过,不明白“@”是什么意思,并且我试了你这个命令,报错。
cp b.txt bb.txt && vi -c '%s/$/####/g' -c 'wq' bb.txt 这样却是可以的。
回复 支持 反对

使用道具 举报

发表于 2007-7-26 17:17:12 | 显示全部楼层
ah, "\$" should be "$", since I used single-quot in the command line.
"@" is just a delimeter for the substitution command, same meaning as '/'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-26 20:16:47 | 显示全部楼层
[HTML]
$ cat a2.txt
1,a1,aa1,    ,
2,123456,aa2,a2,    ,
3,123,    ,
4,123456,aa4,aa4,    ,

$ rev a2.txt | cut -c 2- | rev > a3.txt

$cat a3.txt
1,a1,aa1,   
2,123456,aa2,a2,   
3,123,   
4,123456,aa4,aa4,   
[/HTML]

谢谢楼上几位,用这个方法实现了

先用rev把a2.txt每一行反向输出
然后通过cut -c 2- 把第一列去掉
然后再用rev反向输出一次
回复 支持 反对

使用道具 举报

发表于 2007-7-26 21:42:12 | 显示全部楼层
  1. perl -pe ' s/\s+,$//' a.txt
  2. perl -ne ' s/$/####/' b.txt
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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