Board logo

标题: [问题求助] gawk命令的%号和引号问题 [打印本页]

作者: zhanglei1371    时间: 2014-3-5 16:15     标题: gawk命令的%号和引号问题

近来学习gawk,发现有很多问题,因为主要是在bat里运行的,故很多命令不出效果,如下:
使用printf格式化字符串:
文本a.txt:
  1. Fruit            Frice/lbs            Quantity
  2. Banana           $0.89                100
  3. Peach            $0.79                65
  4. Kiwi             $1.50                22
  5. Pineapple        $1.29                35
  6. Apple            $0.99                78
复制代码
代码:
  1. 原代码:
  2. gawk '{ printf "%-15s %s",$1,$3 ; }' a.txt
  3. 为了在bat中执行,将'变为"
  4. gawk "{ printf "%-15s %s",$1,$3 ; }" a.txt
  5. 结果运行后没有任何消息;
复制代码
找了这个教程:
http://bbs.bathome.net/viewthrea ... &highlight=gawk
运行如下指令:
  1. Rem 每行后面增加一行空行
  2. gawk "1;{print ""}"
  3. gawk "BEGIN{ORS="\n\n"};1"
  4. Rem 每行后面增加两行空行
  5. gawk "1;{print "\n"}"
  6. 错误消息:
  7. gawk: cmd. line:1: 1;{print \n}
  8. gawk: cmd. line:1:          ^ backslash not last character on line
  9. gawk: cmd. line:1: 1;{print \n}
  10. gawk: cmd. line:1:          ^ syntax error
复制代码
故该怎么解决?先感谢了!
作者: DAIC    时间: 2014-3-5 16:29

  1. @echo off
  2. gawk "{printf \"%%-15s %%s\n\",$1,$3}" a.txt
  3. pause
复制代码

作者: DAIC    时间: 2014-3-5 16:32

  1. REM 每行后面增加一行空行
  2. gawk "1;{print \"\"}" a.txt
  3. gawk "BEGIN{ORS=\"\n\n\"};1" a.txt
  4. REM 每行后面增加两行空行
  5. gawk "1;{print \"\n\"}" a.txt
复制代码

作者: zhanglei1371    时间: 2014-3-7 14:56

本帖最后由 zhanglei1371 于 2014-3-7 14:58 编辑

回复 3# DAIC

可否解释下gawk后面的阿拉伯数字1是什么意思,另外,有这样的句子:

    gawk '($2 ~ /^\$[1-9][0-9]*\.[0-9][0-9]$/) && ($3<75){ printf "%s%t%s%t%s",$0,"*", ; }'
后面出现了"REORDER"及中间的%t,(我知道s代表字符串,d为是数字),不知何意,可否解释下?谢谢
作者: PowerShell    时间: 2014-3-7 16:00

面向对象属性之妙,楼主看过了么?   看了就要用,不用白瞎了,
我觉得powershell  win下 格式化 信息 无敌!
呵呵,你用他试试格式化下信息试试吧,

相关命令为:
你的命令输出 | format-tabl
你的命令输出 | format-list
你的命令输出 | Out-GridView
你的命令输出 |  Export-Csv
你的命令输出 | ConvertTo-Csv
你的命令输出 |  ConvertTo-Html

很多较乱的东西,导出到csv,再导入,再看,自动好了。
作者: DAIC    时间: 2014-3-7 16:35

回复 4# zhanglei1371


http://bbs.chinaunix.net/viewthread.php?tid=1552660#pid11095215
作者: DAIC    时间: 2014-3-7 16:43

回复 4# zhanglei1371


    %t估计是写错了,应该\t
作者: zhanglei1371    时间: 2014-3-7 16:55

回复 5# PowerShell


    PS虽然很强,但是毕竟我还是用xp居多,单位电脑全是xp。ps通用性不如bat
不过以后肯定会去学习,已经看过些资料了
作者: zhanglei1371    时间: 2014-3-7 16:56

回复 7# DAIC


    谢谢,终于知道了,原来1等价于{print $0},那么,\t和reorder呢?可否指点下含义,或是给出些参考?
作者: DAIC    时间: 2014-3-7 17:10

\t 表示制表符tab

[root]# echo a b c | gawk '{print $1"\t"$2"\t"$3}'
a       b       c
作者: DAIC    时间: 2014-3-7 17:14

REORDER是不是文本里面取到的内容啊
作者: zhanglei1371    时间: 2014-3-7 17:35

回复 11# DAIC


    从这里看到的:Gawk简明教程:
http://www.truevue.org/linux/gawk-introduction
在模式中使用关系表达式

5). gawk '$3<=75 { printf "%s%t%s\n",$0,"REORDER" ; } $3>75 print $0; ' fruit.txt

在模式中使用匹配、正则表达式、关系表达式、逻辑表达式样

6). gawk '($2 ~ /^\$[1-9][0-9]*\.[0-9][0-9]$/) && ($3<75){ printf "%s%t%s%t%s",$0,"*","REORDER" ; }' fruit.txt

去掉了就会出错
作者: DAIC    时间: 2014-3-7 19:58

回复 12# zhanglei1371


这个教程错误的地方太多了,建议不要继续看啦。
  1. gawk "$3<=75 { printf \"%s\t%s\n\",$0,\"REORDER\" ; } $3>75 {print $0} " fruit.txt
复制代码

作者: zhanglei1371    时间: 2014-3-7 22:38

本帖最后由 zhanglei1371 于 2014-3-7 22:39 编辑

回复 13# DAIC

谢谢DAIC大校,上面的式子修改后的确可以了,但是加个\"REORDER\"是何意?发现随便改成其他的字串也行,去掉就会出错,最后想再请教下这里:
gawk "{($4>0)? print $4: print $1}" a.txt          --------------错误
gawk "{($4>0)? }{print $4}:{ print $1}" a.txt          --------------错误
而这样写就可以:gawk "{print ($4>0)? $4: $1}" a.txt
这样也行:gawk "{if ($4>0) {print $4} else {print $1}}" a.txt
为何前面两个print就不行呢?
作者: DAIC    时间: 2014-3-8 10:44

但是加个\"REORDER\"是何意?发现随便改成其他的字串也行,去掉就会出错

printf \"%s\t%s\n\",$0,\"REORDER\" ;
这个printf要输出两个%s字符串,所以需要两个参数,一个是$0,另一个是REORDER,可以把REORDER改成任何字符串,只是为了在结果里面标示一下而已,告诉你哪些行的第三列小于等于75
作者: DAIC    时间: 2014-3-8 10:47

回复 14# zhanglei1371


? : 三元运算符只是在语法结构上类似 if else
不是说具体语法完全一样
它里面不允许这样直接有动作(包括print)




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2