免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2373 | 回复: 8
打印 上一主题 下一主题

[文本处理] awk 和awk print,printf疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-10-24 09:57 |只看该作者 |倒序浏览
本帖最后由 kwunkau 于 2016-10-24 10:05 编辑

最近在看到yinyuemi的awk数组学习心得,看到print,printf有一些疑问


  1. Inputfile
  2. 1 2 3 4 5 6
  3. 2 3 4 5 6 1
  4. 3 4 5 6 1 2
  5. 4 5 6 1 2 3
  6. Outputfile
  7. 4 3 2 1
  8. 5 4 3 2
  9. 6 5 4 3
  10. 1 6 5 4
  11. 2 1 6 5
  12. 3 2 1 6

  13. awk '{
  14.      if (max_nf < NF)
  15.           max_nf = NF # 数组第一维的长度
  16.      max_nr = NR      # 数组第二维的长度
  17.      for (x = 1; x <= NF; x++)
  18.           vector[x, NR] = $x #建立数组vector
  19. }
  20. END {
  21.      for (x = 1; x <= max_nf; x++) {
  22.           for (y = max_nr; y >= 1; --y)
  23.                printf("%s ", vector[x, y])
  24.           printf("\n")
  25.      }
  26. }'
复制代码


14行的awk '{ (按了enter键?)这个和awk写在同一行有什么区别吗????
例如这样,awk '{if(max_nf < NF){max_nf=NF;max_nr=NR;for(x=1;x<=NF;i++){vector[x,NR]=$x}}} END {for(x=1;x<=max_nf;x++){for(y = max_nr; y >= 1; --y){print vector[x,y]}}}' Inputfile



上面的命令,一直运行中,是有什么错误吗?求大神解答,另外

printf:可以自定义输出的模式,另外输出内容之后不自动换行

print:输出内容之后自动换行

print和printf就这个区别吗?


总结下问题:

1.awk分开写和写在同一行是有什么区别的

2.awk '{if(max_nf < NF){max_nf=NF;max_nr=NR;for(x=1;x<=NF;i++){vector[x,NR]=$x}}} END {for(x=1;x<=max_nf;x++){for(y = max_nr; y >= 1; --y){print vector[x,y]}}}' --------这命令哪里错了。。。

3.print和printf的区别?










论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2016-10-24 10:17 |只看该作者
回复 1# kwunkau

1.awk分开写和写在同一行是有什么区别的

没区别


2.awk '{if(max_nf < NF){max_nf=NF;max_nr=NR;for(x=1;x<=NF;i++){vector[x,NR]=$x}}} END {for(x=1;x<=max_nf;x++){for(y = max_nr; y >= 1; --y){print vector[x,y]}}}' --------这命令哪里错了。。。

  没有语法错误, 但有致命的逻辑错误..


3.print和printf的区别?

  printf "format", ...
  print "string"

简单区别,print用于简单打印
printf / sprintf功能强大...

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2016-10-26 16:19:04
3 [报告]
发表于 2016-10-24 10:18 |只看该作者
1、第一个问题:没有什么区别
2、awk '{if(max_nf < NF){max_nf=NF;max_nr=NR;for(x=1;x<=NF;i++){vector[x,NR]=$x}}} END {for(x=1;x<=max_nf;x++){for(y = max_nr; y >= 1; --y){print vector[x,y]}}}'    for(x=1;x<=NF;i++)------这是 for(x=1;x<=NF;x++)不是i++
3、print 和printf 是换行符的问题,
cat  a
a
b
awk '{print $1}' a
a
b
awk '{printf $1}' a
ab

论坛徽章:
0
4 [报告]
发表于 2016-10-24 10:29 |只看该作者
回复 2# jason680

改正了i++,确实逻辑错了,输出的结果不是我想要的

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
5 [报告]
发表于 2016-10-24 10:30 |只看该作者

awk '{if(max_nf < NF){max_nf=NF};max_nr=NR;for(x=1;x<=NF;x++){vector[x,NR]=$x}} END {for(x=1;x<=max_nf;x++){for(y = max_nr; y >= 1; --y){printf("%s ",vector[x,y])};printf"\n"}}'

论坛徽章:
0
6 [报告]
发表于 2016-10-24 10:30 |只看该作者
回复 3# fh21_xuejinlian

太谢谢了,改正了,但是命令逻辑错了

论坛徽章:
0
7 [报告]
发表于 2016-10-24 10:38 |只看该作者
回复 5# moperyblue

谢啦,学习下

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
8 [报告]
发表于 2016-10-24 10:39 |只看该作者
1.awk分开写和写在同一行是有什么区别的
写在同一行的话, 表达式或语句之间需要使用分号";"隔开


2.awk '{if(max_nf < NF){max_nf=NF;max_nr=NR;for(x=1;x<=NF;i++){vector[x,NR]=$x}}} END {for(x=1;x<=max_nf;x++){for(y = max_nr; y >= 1; --y){print vector[x,y]}}}' --------这命令哪里错了。。。

你这里乱来啊, 前面是 x, 后面就变成 i 了.
还有, 不管是条件还是循环体, 当代码块里有多条语句时需要使用大括号括起来, 如果只有一条语句, 则可以将大括号省略. 你这段代码对照上边儿是有问题的.

awk '{if(max_nf < NF){max_nf=NF;max_nr=NR;for(x=1;x<=NF;i++){vector[x,NR]=$x}}} END {for(x=1;x<=max_nf;x++){for(y = max_nr; y >= 1; --y){print vector[x,y]}}}'

实际上是:

awk '{ if(max_nf < NF)max_nf=NF; max_nr=NR; for(x=1;x<=NF;x++)vector[x,NR]=$x } END { for(x=1;x<=max_nf;x++) for(y = max_nr; y >= 1; --y)print vector[x,y] }'

如颜色所示: if语句这条件后边只有一条语句, 所以可以省略大括号(当然加上大括号也没关系), 所以绿色的是一个整体,
蓝色是一个整体,
for循环体内也只有一条语句, 所以也可以省略大括号(当然加上大括号也没关系),紫色是一个整体

后边儿, 第一个for循环体内只有一个循环体, 没有其他的语句, 所以可以省略第一个大括号,  第二个for循环体内只有一条语句, 所以可以省略第二个大括号

如果都加上大括号就是这样的:
awk '{ if(max_nf < NF){ max_nf=NF }; max_nr=NR; for(x=1;x<=NF;x++) { vector[x,NR]=$x } } END { for(x=1;x<=max_nf;x++){ for(y = max_nr; y >= 1; --y){ print vector[x,y] } }}'


3.print和printf的区别?
print就是输出, 无输出格式, 本身自带回车符
printf 可以定义各种输出格式, 不带回车符


论坛徽章:
0
9 [报告]
发表于 2016-10-24 10:48 |只看该作者
回复 8# reyleon

谢谢六哥,太详细了,确实增长了好多知识
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP