AWK多文件的处理的方式

直接多文件逐个处理,操作相同:

1、直接输入多个文件名:

> awk 'BEGIN{FS="|";OFS="|";print "GSM|BALANCE"}{if($13==20120530)print $1,$9}' 
Subscriber_20120530.list Subscriber_20120531.list

2、根据正则表达式匹配多个文件:

> awk 'BEGIN{FS="|";OFS="|";print "GSM|BALANCE"}{if($13==20120530)print $1,$9}' 
Subscriber_2012053*.list


对不同文件,执行不同操作:

1、只有两个文件时:(1.NR:已读总记录数     FNR:已读当前文件记录数   2.next果结束就执行下一个输入文件)

      1)、格式:awk 'NR==FNR{...}NR>FNR{...}'  file1 file2   或 awk 'NR==FNR{...}NR!=FNR{...}' file1 file2

> awk -F\| '{if($13==20120530){a[$1]=$1}}NR>FNR{if(a[$1]==$1)print $1,$9}'
Subscriber_20120531.list Subscriber_20120530.list
> awk -F\| '{if($13==20120530){a[$1]=$1}}NR!=FNR{if(a[$1]==$1)print $1,$9}' 
Subscriber_20120531.list Subscriber_20120530.list



      2)、格式:awk 'NR==FNR{...;next}{...}' file1 file2

> awk -F\| 'NR==FNR{if($13==20120530){a[$1]=$1}next}{if(a[$1]==$1)print $1,$9}' 
Subscriber_20120531.list Subscriber_20120530.list

2、多于两个文件时:(1.ARGIND:当前被处理参数标志      2.ARGV :命令行参数数组      3.把文件名直接加入判断)

      1)、格式:awk 'ARGIND==1{...}ARGIND==2{...}ARGIND==3{...}... ' file1 file2 file3 ...

> awk 'BEGIN{FS="|";OFS="|";print "GSM|BALANCE"}
ARGIND==1{if($13==20120530){a[$1]=$1}}
ARGIND==2{if(a[$1]==$1 && $9>0)print $1,$9}
ARGIND==3{if(a[$1]==$1 && $9>0)print $1,$9}' 
Subscriber_20120531.list Subscriber_20120530.list Subscriber_20120529.list


      2)、格式:awk 'FILENAME==ARGV[1]{...}FILENAME==ARGV[2]{...}FILENAME==ARGV[3]{...}...' file1 file2 file3 ...

> awk 'BEGIN{FS="|";OFS="|";print "GSM|BALANCE"}
FILENAME==ARGV[1]{if($13==20120530){a[$1]=$1}}
FILENAME==ARGV[2]{if(a[$1]==$1 && $9>0)print $1,$9}
FILENAME==ARGV[3]{if(a[$1]==$1 && $9>0)print $1,$9}' 
Subscriber_20120531.list Subscriber_20120530.list Subscriber_20120529.list

 

     3)、格式:awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...

> awk 'BEGIN{FS="|";OFS="|";print "GSM|BALANCE"}
FILENAME=="Subscriber_20120531.list"{if($13==20120530){a[$1]=$1}}
FILENAME=="Subscriber_20120530.list"{if(a[$1]==$1 && $9>0)print $1,$9}
FILENAME=="Subscriber_20120529.list"{if(a[$1]==$1 && $9>0)print $1,$9}' 
Subscriber_20120531.list Subscriber_20120530.list Subscriber_20120529.list


对于多个文件处理时,只有第一个文件处理方式不同,后面多个(未知个数)文件处理方式一致,如何精简后面部分重复代码,有高手知道请指点下,呵

> awk 'BEGIN{FS="|";OFS="|";print "GSM|BALANCE"}
FILENAME==ARGV[1]{if($13==20120530){a[$1]=$1}}
FILENAME==ARGV[2]{if(a[$1]==$1 && $9>0)print $1,$9}
FILENAME==ARGV[3]{if(a[$1]==$1 && $9>0)print $1,$9}
FILENAME==ARGV[4]{if(a[$1]==$1 && $9>0)print $1,$9}
FILENAME==ARGV[5]{if(a[$1]==$1 && $9>0)print $1,$9}
......' 
Subscriber_20120531.list Subscriber_20120530.list 
Subscriber_20120529.list Subscriber_20120528.list 
Subscriber_20120527.list ......

### 如何使用 `awk` 进行批量文件处理 #### 使用 `awk` 处理多个文件 当需要对多个文件执行相同的操作时,可以利用 `awk` 的强大功能来简化这一过程。通过指定多个输入文件名作为参数传递给 `awk` 命令,可以在一次调用中完成多文件的数据解析与转换工作。 对于简单的批处理操作,可以直接在命令行上罗列待处理文件列表: ```bash awk '{print $1}' file1.txt file2.txt file3.txt ``` 上述指令会依次读取每个文件的内容,并打印每一行的第一个字段[^1]。 #### 结合通配符实现更灵活的匹配 如果目标目录下存在大量具有相似命名模式的日志或数据记录文档,则可以通过引入路径表达式的概念进一步优化脚本设计。具体来说就是运用星号(*)或其他形式的正则字符集合作为占位符代表某一类特定类型的文件集合。 例如要统计某日志目录里所有 `.log` 后缀结尾文本中的错误条目数量: ```bash awk '/ERROR/ {count++} END{print count}' *.log ``` 这里不仅实现了跨文件的信息汇总计算,还展示了条件筛选以及最终结果输出的能力[^2]。 #### 利用循环结构自动化任务流程 为了使解决方案更加通用化,在某些场景可能涉及到动态获取待处理对象的情况。此时借助于 shell 脚本所提供的控制语句能够有效提升程序逻辑构建上的灵活性。 下面给出一段完整的例子用于说明如何遍历当前文件夹下的所有纯文本文件并提取其中第二列数值求平均值的过程: ```bash #!/bin/bash total=0 file_count=0 for filename in $(find . -name "*.txt"); do ((file_count++)) sum=$(awk '{sum += $2} END {print sum}' "$filename") total=$((total + sum)) done average=$((total / file_count)) echo "Average value across all txt files is: ${average}" ``` 此段代码片段首先定义了一个外部变量存储累加后的总和;接着采用 find 工具定位符合条件的目标资源;最后再配合内部 AWK 表达式完成核心运算部分的工作流描述[^3]。 #### 实现复杂业务需求 面对更为复杂的实际应用案例时,还可以考虑将更多高级特性融入到基于AWK的语言环境中去解决问题。比如关联数组的应用可以帮助我们轻松应对涉及分组聚合的需求;而自定义函数机制则允许封装重复使用的算法单元以便提高维护效率等等。 综上所述,掌握了这些技巧之后便足以胜任大多数日常工作中遇到的大规模文本型数据预处理挑战了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值