免费注册 查看新帖 |

Chinaunix

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

有关awk字段分隔符  关闭 [复制链接]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
21 [报告]
发表于 2008-08-11 13:30 |只看该作者
原帖由 peckerwood 于 2008-8-11 13:26 发表

很不错  我正想要这个呢

cat char.txt

a b c d
e f g h
i j k l

awk '{OFS = "|";$2=$2;print $0}' char.txt
a|b|c|d
e|f|g|h
i|g|k|l

awk '{for(i=1;i


awk '{for(i=1;i<NF;i++)printf("%s|",$i);printf $NF"\n"}'

论坛徽章:
0
22 [报告]
发表于 2008-08-11 13:34 |只看该作者
帅!谢了
还是得多练 郁闷 思考了半天竟没想到 i<NF

论坛徽章:
0
23 [报告]
发表于 2008-08-22 23:24 |只看该作者
最近正在学习awk,对于本问题我是这样理解的

  1. $echo "a b c d" | awk -v OFS=":" '{ print $0}'
  2. a b c d
复制代码

awk预定义RS,FS,ORS,OFS变量分别为'\n'、'[ \t]+'、'\n'、' '。
awk 每一次输入文本时,NR变量自动加一,根据RS确定一次输入文本的内容将其赋给$0这一位置变量(是变量吆),再根据FS对其进行分域(也就是把各域的字符串分别赋给位置变量$1、$2、$3、... ;并且更新NR变量)
当输入文本后,更改OFS变量,但不是更改$0位置变量的值(考虑一下更改一个普通变量会更改另一个变量吗?),所以 print $0 打印出 “a b c d”

  1. $echo "a b c d" | awk -v OFS=":" '{$1=$1; print $0}'
  2. a:b:c:d
复制代码

而当对某一位置变量更改时,同时$0也会改变(因为$0就是所有位置变量和OFS的总和,他们之间是相关的,牵一发而动全身),awk会重新根据OFS的值更改$0的值(将OFS插入每两个相邻的位置变量的中间,然后将该字符串赋给$0),这样$0自然就是“a:b:c:d”,print $0 的输出也就不足为怪了。

以上解释仅是个人推断,如果解释有错误,还望指出

论坛徽章:
0
24 [报告]
发表于 2008-08-23 08:32 |只看该作者

  1. $echo "a b c d" | awk 'BEGIN{OFS=":"}{print $0}'
  2. a b c d
复制代码

以上BEGIN语句对OFS的赋值不起作用,是否可说明上楼推断错误
我再一次大胆推断
因为awk 默认OFS的值是 ' ' ,在预定义中OFS 的值被赋为空格后,就立即把其值作为第一行的域分隔符预先保存(因为BEGIN语句可有可无,所以该操作在BEGIN语句前执行)。
此语句OFS的第一个值是 ' ' ,在BEGIN语句改变了OFS ':' ,此为第二个值,而此前awk 已预先保存了第一个值作为第一行的域分隔符,此时的OFS对$0已不起作用,若想起作用,必须对位置变量进行更改,进而对$0进行更改;或者在下一循环读入文本awk 重新读入OFS的值

论坛徽章:
0
25 [报告]
发表于 2008-08-28 11:08 |只看该作者

回复 #8 twlogin 的帖子

[root@mj-service-tomcat yujx]# echo 'a b            b d' |awk '{OFS=":";print }'
a b            b d
[root@mj-service-tomcat yujx]# echo 'a b            b d' |awk '{OFS=":";print $1,$2,$3,$4}'
a:b:b:d



又学了一招,好好学习,天天向上

论坛徽章:
0
26 [报告]
发表于 2008-08-28 12:14 |只看该作者

回复 #18 灿烂小猪 的帖子

[root@mj-service-tomcat yujx]# echo 'a b c d' |awk '{for(i=1;i<=NF;i++)print i}'
1
2
3
4
[root@mj-service-tomcat yujx]# echo 'a b c d' |awk '{for(i=1;i<=NF;i++)print $i}'
a
b
c
d

能帮我解释一个i 与$i吗?谢谢了

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
27 [报告]
发表于 2008-08-28 12:18 |只看该作者

回复 #26 wtuter 的帖子

没有看过awk 资料?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP