免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: evanking
打印 上一主题 下一主题

如何替换数据中的空格分隔符 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-07-07 02:07 |只看该作者
原帖由 xwmhmily 于 2008-7-7 01:57 发表
我的也可以做到哦:

cat yourFile | gawk '{ print $1"|"$2"|"$3 }'

这个我发过了。

论坛徽章:
0
32 [报告]
发表于 2008-07-07 02:22 |只看该作者
对于awk也是学不进去,感觉还是没有的指导.

记得再深的东西,如果有讲解好的,一样是可以易于上路和掌握的.

perl也是文档一堆,但没学到什么.

论坛徽章:
0
33 [报告]
发表于 2008-07-07 08:18 |只看该作者

  1. awk -v OFS='|' 'NF++'  数据文件

  2. 解释:
  3. -v OFS='|'  输出的时候,用|作为字段的分隔符
  4. NF++ 把字段数增加1,是为了在最后面加一个|

  5. sed 's/^\([[:blank:]]*\)\(.*\)/\2 /;s/[[:blank:]]\+/|/g' 数据文件

  6. 解释:
  7. s/^\([[:blank:]]*\)\(.*\)/\2 /;  去掉行首的空白,并在行尾加上一个空格,是为了在最后增加一个|
  8. s/[[:blank:]]\+/|/g'  把连续的空白符替换成一个|

  9. 如果只是空格分隔的话,并且是gnu sed,可以这样
  10. sed -r 's/^( *)(.*)/\2 /;s/ +/|/g'  数据文件

复制代码

[ 本帖最后由 springwind426 于 2008-7-7 08:21 编辑 ]

论坛徽章:
0
34 [报告]
发表于 2008-07-07 09:45 |只看该作者
原帖由 walkerxk 于 2008-7-6 23:44 发表
二楼的sed也没用,用sed的话要三步:sed 's/^ \+//;s/ \+/|/g;s/ *$/|/;'


可以这样分步处理
以前不知道。

论坛徽章:
0
35 [报告]
发表于 2008-07-07 10:14 |只看该作者
学习了
无论是解题的思路还是代码.....
不过 awk 'BEGIN{OFS="|"} {$1=$1;print}' urfile
中的$1=$1 有没有人可以解释一下....

论坛徽章:
0
36 [报告]
发表于 2008-07-07 10:38 |只看该作者
原帖由 edei2004 于 2008-7-7 10:14 发表
学习了
无论是解题的思路还是代码.....
不过 awk 'BEGIN{OFS="|"} {$1=$1;print}' urfile
中的$1=$1 有没有人可以解释一下....




通常情况下,awk是不对$0(原始的行数据)进行处理(我只知道gnu awk是这样的,其他版本的awk是否是这样不得而知)  print如果不带参数,就表示 print $0

用$1=$1,就是强制awk对原始数据进行处理

同样的,我的代码中的NF++也有类似的功能,只是增加了一个字段,就是为了在结尾增加|,如果不需要在结尾添加分隔符|的话,用NF=NF也有同样的作用

其实,{$1=$1;print}的代码可以直接简化成$1=$1
awk的代码分为  条件{动作},如果{动作}省略的话,缺省使用{print $0}  $1=$1是一个赋值语句,永远是真的


修正一下,$1=$1 实际上先用$1做条件判断,然后再做赋值操作,因此,如果$1=0或者$1为空,就是长度为0的字符串的话,条件就是假了。
因此,用$1=$1代替{$1=$1;print}的做法是不严谨的。

不过,如果不设置FS,那么awk的缺省会用空白符做FS,因此不会出现$1为空的情况,因此就有可能存在$1=0的情况。

[ 本帖最后由 springwind426 于 2008-7-7 11:01 编辑 ]

论坛徽章:
0
37 [报告]
发表于 2008-07-07 10:45 |只看该作者
原帖由 springwind426 于 2008-7-7 10:38 发表




通常情况下,awk是不对$0(原始的行数据)进行处理(我只知道gnu awk是这样的,其他版本的awk是否是这样不得而知)  print如果不带参数,就表示 print $0

用$1=$1,就是强制awk对原始数据进行处理

同 ...


不知道是不是我太笨,还是不太理解$1=$1的作用,把$1=$1换为$1=$2也是可以的。

论坛徽章:
0
38 [报告]
发表于 2008-07-07 11:05 |只看该作者
原帖由 可可熊 于 2008-7-7 10:45 发表


不知道是不是我太笨,还是不太理解$1=$1的作用,把$1=$1换为$1=$2也是可以的。



$1=$2是不可以的,因为它已经改变了$0中的内容,而不是让它重新处理$0

比如有一行数据是

  1. a      b           c
  2. 如果不做任何处理,awk将打印
  3. a      b           c
  4. 如果设置$1=$1,那么awk将打印
  5. a b c
  6. 如果设置$1=$2,那么awk将打印
  7. b b c

  8. 例:
  9. echo 'a    b       c' | awk '$1'
  10. echo 'a    b       c' | awk '$1=$1'
  11. echo 'a    b       c' | awk '$1=$2'
复制代码

论坛徽章:
0
39 [报告]
发表于 2008-07-07 11:09 |只看该作者
原帖由 springwind426 于 2008-7-7 11:05 发表



$1=$2是不可以的,因为它已经改变了$0中的内容,而不是让它重新处理$0

比如有一行数据是

a      b           c
如果不做任何处理,awk将打印
a      b           c
如果设置$1=$1,那么awk将打印 ...



上面那个打错了,是使用$2=$2;

论坛徽章:
0
40 [报告]
发表于 2008-07-07 11:29 |只看该作者
原帖由 可可熊 于 2008-7-7 11:09 发表



上面那个打错了,是使用$2=$2;



那就无所谓了,只要让awk认为你需要修改$0的内容就可以了(实际上你并没有改变$0的有效内容)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP