标题: 【已解决】批处理中用gawk处理文本的时候只能选择单个文本吗? [打印本页]
作者: tommytangtang 时间: 2014-8-15 22:50 标题: 【已解决】批处理中用gawk处理文本的时候只能选择单个文本吗?
本帖最后由 tommytangtang 于 2014-8-16 01:28 编辑
批处理中用gawk处理文本的时候只能选择单个文本吗?
可以使用通配符代表所有后缀名相同的文件,然后进行操作吗?
@gawk -F"," "{print $3 \" \" $4 \" \" $5}" *.txt>*a.txt
网上查了很久没找到这方面
作者: CrLf 时间: 2014-8-15 23:21
你想表达什么
作者: tommytangtang 时间: 2014-8-15 23:33
回复 2# CrLf
就是说,一个文件夹里有很多文本,我想对每一个进行同样的操作
@gawk -F"," "{print $3,$4,$5}" 123.txt>123a.txt
@gawk -F"," "{print $3,$4,$5}" 132.txt>132a.txt
@gawk -F"," "{print $3,$4,$5}" 111.txt>111a.txt
@gawk -F"," "{print $3,$4,$5}" 23.txt>23a.txt
@gawk -F"," "{print $3,$4,$5}" 13.txt>13a.txt
。。。。。。
还有很多文本需要一起处理
可以像rename一样使用通配符吗?
作者: CrLf 时间: 2014-8-15 23:51
本帖最后由 CrLf 于 2014-8-16 01:07 编辑
- gawk -F"," "FNR==1{sub(/\.[^\.]*$/,\"a^&\",FILENAME)}{print $3,$4,$5>FILENAME}" *.txt
复制代码
内置变量:
FNR 代表相当于文件中的 NR
FILENAME 是当前正在操作的文件名,仅在文件变更时更新
条件执行:
FNR==1 表示当前文件的第一行执行其后的代码块
内置函数:
sub 用于单次替换,有一个 gsub 用于多次替换,若要向后引用则需使用 gensub
输出重定向:
>FILENAME 这就不用解释了吧
作者: CrLf 时间: 2014-8-16 00:06
本帖最后由 CrLf 于 2014-8-16 00:14 编辑
如果对 gawk 不熟,不是技术控的话可以用熟悉的脚本来辅助:
批处理- for %%a in (*.txt) do @gawk -F"," "{print $3,$4,$5}" "%%a">"%%~naa%%~xa"
复制代码
powershell- dir *.txt|?{-not $_.PsIsContainer}|%{gawk -F',' '{print $3,$4,$5}' $_.name>$_.basename+'a'+$_.Extension}
复制代码
bash:- for file in *.tar ; do gawk -F',' '{print $3,$4,$5}' $file>${file%.*}a.${file##*.}; done
复制代码
总之哪个顺手用哪个
作者: tommytangtang 时间: 2014-8-16 00:44
回复 4# CrLf
研究了很久,才发现你写的少了句-F"," 怪不得出来的都是空格呢
@gawk -F"," "FNR==1{sub(/\..*?/,\"a^&\",FILENAME)}{print $3,$4,$5>FILENAME}" *.txt
刚刚在网上学正则表达式,还在研究sub后面括弧里的东西,双引号里用双引号需要加\转码之类的……能帮忙解释一下替换文件名得过程嘛?
作者: CrLf 时间: 2014-8-16 01:07
本帖最后由 CrLf 于 2014-8-16 01:19 编辑
/\..*?/ 其实我原意是 /\..*?$/ 或者 /\.[^\.]*$/ 的,打漏了...
看来 sub 不支持用 ? 来进行非贪婪匹配,不然应该只会匹配到一个 .,4 楼代码已修改- / 经常用来表示这是个正则表达式,实际的 Pattern 是 \..*?
- \. 表示一个 . 字符
- .*? 表示任意字符,加 ? 是非贪婪匹配,简单说就是怎么短怎么匹配,而在贪婪模式下就是怎么长怎么匹配
- $ 可以匹配行末或文末,与 ^ 对应,^ 代表行首
复制代码
----------------------------------------------
a^&
转义后传递给 gawk 的其实是 a&复制代码
sed 中也用 & 代表匹配的内容,不知道是不是 posix 标准中约定的,有些语言是用 $0 或者 \0 来指代的,使用 pcre 库实现正则的语言就很可能是用 $0 或 \0 的,比如 perl
----------------------------------------------
假设 FILENAME 为 test.txt,/\..*/ 匹配到的是 .txt,那么 .txt 将被替换成 a& 对应的值: a.txt,所以替换的结果是 testa.txt
作者: CrLf 时间: 2014-8-16 01:18
本帖最后由 CrLf 于 2014-8-16 01:26 编辑
各种语言的正则实现略有差别,但区别只在向后引用的写法、是否支持非贪婪匹配、是否支持零宽断言、特殊字符的转义方式等高级用法和语法细节上,据我所知像 . * ? [] {} ^ $ 这些基本的功能都是通用的
用 sed 非常需要懂正则,相比之下 gawk 倒不是很依赖了
这个资料貌似挺全的,我还学到了以前没学过的平衡组/递归匹配用法:
deerchao 的《正则表达式30分钟入门教程》
话说脚本之家的版本竟然比原作者的还新,他是肿么做到的!震精了!
作者: tommytangtang 时间: 2014-8-16 01:25
回复 7# CrLf
谢谢这么详细的解释,今天太晚了,明天继续研究下正则表达式,编程初学者问题较多哈
作者: tommytangtang 时间: 2014-8-16 01:28
各种语言的正则实现略有差别,但区别只在向后引用的写法、是否支持非贪婪匹配、是否支持零宽断言、特殊字符 ...
CrLf 发表于 2014-8-16 01:18
哈哈,我刚刚说正在学正则,就是看这篇文章,刚刚把他copy到文档永久保存了,谢谢
作者: DAIC 时间: 2014-8-16 08:19
推荐《精通正则表达式(第三版)》
作者: Linuxer 时间: 2014-8-16 09:53
回复 8# CrLf
作者自己网站上的版本跟脚本之家的是一样的最新版本,cnblog的版本没有更新。
作者: CrLf 时间: 2014-8-16 16:06
回复 12# Linuxer
作者一定不是处女座
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |