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

【已解决】批处理中用gawk处理文本的时候只能选择单个文本吗?

本帖最后由 tommytangtang 于 2014-8-16 01:28 编辑

批处理中用gawk处理文本的时候只能选择单个文本吗?
可以使用通配符代表所有后缀名相同的文件,然后进行操作吗?
@gawk -F","  "{print $3 \" \" $4 \" \" $5}" *.txt>*a.txt
网上查了很久没找到这方面

你想表达什么

TOP

回复 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一样使用通配符吗?

TOP

本帖最后由 CrLf 于 2014-8-16 01:07 编辑
  1. gawk -F"," "FNR==1{sub(/\.[^\.]*$/,\"a^&\",FILENAME)}{print $3,$4,$5>FILENAME}" *.txt
复制代码
内置变量:
FNR 代表相当于文件中的 NR
FILENAME 是当前正在操作的文件名,仅在文件变更时更新
条件执行:
FNR==1 表示当前文件的第一行执行其后的代码块
内置函数:
sub 用于单次替换,有一个 gsub 用于多次替换,若要向后引用则需使用 gensub
输出重定向:
>FILENAME 这就不用解释了吧

TOP

本帖最后由 CrLf 于 2014-8-16 00:14 编辑

如果对 gawk 不熟,不是技术控的话可以用熟悉的脚本来辅助:
批处理
  1. for %%a in (*.txt) do @gawk -F","  "{print $3,$4,$5}" "%%a">"%%~naa%%~xa"
复制代码
powershell
  1. dir *.txt|?{-not $_.PsIsContainer}|%{gawk -F',' '{print $3,$4,$5}' $_.name>$_.basename+'a'+$_.Extension}
复制代码
bash:
  1. for file in *.tar ; do gawk -F','  '{print $3,$4,$5}' $file>${file%.*}a.${file##*.}; done
复制代码
总之哪个顺手用哪个

TOP

回复 4# CrLf


    研究了很久,才发现你写的少了句-F"," 怪不得出来的都是空格呢

@gawk -F"," "FNR==1{sub(/\..*?/,\"a^&\",FILENAME)}{print $3,$4,$5>FILENAME}" *.txt

刚刚在网上学正则表达式,还在研究sub后面括弧里的东西,双引号里用双引号需要加\转码之类的……能帮忙解释一下替换文件名得过程嘛?

TOP

本帖最后由 CrLf 于 2014-8-16 01:19 编辑

/\..*?/ 其实我原意是 /\..*?$/ 或者 /\.[^\.]*$/ 的,打漏了...
看来 sub 不支持用 ? 来进行非贪婪匹配,不然应该只会匹配到一个 .,4 楼代码已修改
  1. / 经常用来表示这是个正则表达式,实际的 Pattern 是 \..*?
  2. \. 表示一个 . 字符
  3. .*? 表示任意字符,加 ? 是非贪婪匹配,简单说就是怎么短怎么匹配,而在贪婪模式下就是怎么长怎么匹配
  4. $ 可以匹配行末或文末,与 ^ 对应,^ 代表行首
复制代码
----------------------------------------------
a^&
转义后传递给 gawk 的其实是 a&
  1. a 是要前缀的内容
  2. & 是匹配的内容
复制代码
sed 中也用 & 代表匹配的内容,不知道是不是 posix 标准中约定的,有些语言是用 $0 或者 \0 来指代的,使用 pcre 库实现正则的语言就很可能是用 $0 或 \0 的,比如 perl
----------------------------------------------
假设 FILENAME 为 test.txt,/\..*/ 匹配到的是 .txt,那么 .txt 将被替换成 a& 对应的值: a.txt,所以替换的结果是 testa.txt

TOP

本帖最后由 CrLf 于 2014-8-16 01:26 编辑

各种语言的正则实现略有差别,但区别只在向后引用的写法、是否支持非贪婪匹配、是否支持零宽断言、特殊字符的转义方式等高级用法和语法细节上,据我所知像 . * ? [] {} ^ $ 这些基本的功能都是通用的
用 sed 非常需要懂正则,相比之下 gawk 倒不是很依赖了
这个资料貌似挺全的,我还学到了以前没学过的平衡组/递归匹配用法:
deerchao 的《正则表达式30分钟入门教程》
话说脚本之家的版本竟然比原作者的还新,他是肿么做到的!震精了!

TOP

回复 7# CrLf


    谢谢这么详细的解释,今天太晚了,明天继续研究下正则表达式,编程初学者问题较多哈

TOP

各种语言的正则实现略有差别,但区别只在向后引用的写法、是否支持非贪婪匹配、是否支持零宽断言、特殊字符 ...
CrLf 发表于 2014-8-16 01:18



    哈哈,我刚刚说正在学正则,就是看这篇文章,刚刚把他copy到文档永久保存了,谢谢

TOP

推荐《精通正则表达式(第三版)》

TOP

回复 8# CrLf


    作者自己网站上的版本跟脚本之家的是一样的最新版本,cnblog的版本没有更新。
1

评分人数

    • CrLf: 原来如此技术 + 1

TOP

回复 12# Linuxer


    作者一定不是处女座

TOP

返回列表