[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 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
复制代码
故该怎么解决?先感谢了!

回复 14# zhanglei1371


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

评分人数

TOP

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

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

TOP

本帖最后由 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就不行呢?

TOP

回复 12# zhanglei1371


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

TOP

回复 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

去掉了就会出错

TOP

REORDER是不是文本里面取到的内容啊

TOP

\t 表示制表符tab

[root]# echo a b c | gawk '{print $1"\t"$2"\t"$3}'
a       b       c

TOP

回复 7# DAIC


    谢谢,终于知道了,原来1等价于{print $0},那么,\t和reorder呢?可否指点下含义,或是给出些参考?

TOP

回复 5# PowerShell


    PS虽然很强,但是毕竟我还是用xp居多,单位电脑全是xp。ps通用性不如bat
不过以后肯定会去学习,已经看过些资料了

TOP

回复 4# zhanglei1371


    %t估计是写错了,应该\t

TOP

TOP

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

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

很多较乱的东西,导出到csv,再导入,再看,自动好了。
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

本帖最后由 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为是数字),不知何意,可否解释下?谢谢

TOP

  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
复制代码
1

评分人数

TOP

返回列表