awk在arm下的不解问题

cooljun008 2013-01-23 05:26:40
我们都听说过这样一句话:一行shell,百行c。于是我们在linux下对文件操作是第一个想到的是利用awk,然而,这次使用awk产生的问题让我非常不解,请大家帮忙。
在ubuntu 11.10下,在当前目录下存在一个文件 user_info.txt,内容如下
a:1:1
d:haha:1
b:3:2
c:1:1

使用如下这句话,很明显,是将将第4行的“c”改为“cc” 并重新写入原文件,达到修改的目的。
awk -F: 'OFS=":"{if($1 == "c") $1="cc";print > "user_info.txt"}' user_info.txt
修改后如下
a:1:1
d:haha:1
b:3:2
cc:1:1

然而同样的一句话,在arm的linux下,执行时,久久未返回,我为此久经周折(毕竟工作中是一个大的程序),它一直在写,没完没了,最后我Ctrl+C让他停止,打开修改的文档,这一幕我怎么都不能理解。文档内容如下
a:1:1
d:haha:1
b:3:2
cc:1:1
.
.
.
上面的三个点代表无数多行,是的,awk为我在文件中增加了上百万行!!!!不知这是什么情况,为什么只在arm下发生。特此向各位求助。(注:文件末位有预留的一行空行)
...全文
193 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicenight 2013-01-24
  • 打赏
  • 举报
回复
我有一个想法,就是所有判断和处理完之后,只在 END 块里边写文件,因为这个只是最后操作一次,所以推测是可行的,lz 不妨试试再分享给我们啊。
cooljun008 2013-01-23
  • 打赏
  • 举报
回复
引用 7 楼 ljc007 的回复:
awk直接修改原文件的方法是不可靠的,即使你在自己的环境里面测试成功,也不要上生产环境,到时候后悔就来不及了。
哦,明白了。谢谢!这个用法还是到换环境才发现问题啊。
ljc007 2013-01-23
  • 打赏
  • 举报
回复
awk直接修改原文件的方法是不可靠的,即使你在自己的环境里面测试成功,也不要上生产环境,到时候后悔就来不及了。
cooljun008 2013-01-23
  • 打赏
  • 举报
回复
引用 3 楼 mymtom 的回复:
换个环境就不行,自然是有问题的。
问题是这样发生的,像你说的弄一个中介文件的确没有问题,但是同样的一句话 awk -F: 'OFS=":"{if($1 == "c") $3="5";print > "user_info.txt"}' user_info.txt 改变的第三项,在arm上完美执行了。这??
cooljun008 2013-01-23
  • 打赏
  • 举报
回复
额,我这实验了,是可以的,但是仔细考虑这个命令会让awk内部发生的操作,的确让我感到有点后怕(判断到一半,重新写入)。
fdl19881 2013-01-23
  • 打赏
  • 举报
回复
我记得ubuntu下直接重定向到原文件也是不行了。
mymtom 2013-01-23
  • 打赏
  • 举报
回复
引用 2 楼 cooljun008 的回复:
像您这样说,每次修改文件都需要另外建立个临时文件作为中介?如果我的做法有问题,那么为什么在ubuntu下能工作正常呢?貌似屡试不爽啊。
换个环境就不行,自然是有问题的。
cooljun008 2013-01-23
  • 打赏
  • 举报
回复
像您这样说,每次修改文件都需要另外建立个临时文件作为中介?如果我的做法有问题,那么为什么在ubuntu下能工作正常呢?貌似屡试不爽啊。
mymtom 2013-01-23
  • 打赏
  • 举报
回复
awk -F: 'OFS=":"{if($1 == "c") $1="cc";print > "user_info.txt"}' user_info.txt 兄弟,你的输入文件和输出文件是同一个啊。 修改文件不是这样的直接改的。 需要重定向另外的文件,然后在改名 awk '{print}' user_info.txt > user_info.tmp mv user_info.tmp user_info.txt

23,114

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧