标题: [问题求助] gawk命令的%号和引号问题 [打印本页]
作者: zhanglei1371 时间: 2014-3-5 16:15 标题: gawk命令的%号和引号问题
近来学习gawk,发现有很多问题,因为主要是在bat里运行的,故很多命令不出效果,如下:
使用printf格式化字符串:
文本a.txt:- Fruit Frice/lbs Quantity
- Banana $0.89 100
- Peach $0.79 65
- Kiwi $1.50 22
- Pineapple $1.29 35
- Apple $0.99 78
复制代码
代码:- 原代码:
- gawk '{ printf "%-15s %s",$1,$3 ; }' a.txt
- 为了在bat中执行,将'变为"
- gawk "{ printf "%-15s %s",$1,$3 ; }" a.txt
- 结果运行后没有任何消息;
复制代码
找了这个教程:
http://bbs.bathome.net/viewthrea ... &highlight=gawk
运行如下指令:- Rem 每行后面增加一行空行
- gawk "1;{print ""}"
- gawk "BEGIN{ORS="\n\n"};1"
- Rem 每行后面增加两行空行
- gawk "1;{print "\n"}"
- 错误消息:
- gawk: cmd. line:1: 1;{print \n}
- gawk: cmd. line:1: ^ backslash not last character on line
- gawk: cmd. line:1: 1;{print \n}
- gawk: cmd. line:1: ^ syntax error
复制代码
故该怎么解决?先感谢了!
作者: DAIC 时间: 2014-3-5 16:29
- @echo off
- gawk "{printf \"%%-15s %%s\n\",$1,$3}" a.txt
- pause
复制代码
作者: DAIC 时间: 2014-3-5 16:32
- REM 每行后面增加一行空行
- gawk "1;{print \"\"}" a.txt
- gawk "BEGIN{ORS=\"\n\n\"};1" a.txt
-
- REM 每行后面增加两行空行
- 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
这个教程错误的地方太多了,建议不要继续看啦。- 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 |