如何使用awk将7个含通用货币列的计数文件合并为汇总文件
使用Awk合并多文件货币计数为CSV汇总表
嗨,作为Unix/awk新手,这个需求其实用awk就能轻松搞定!我来给你一步步拆解解决方案,保证你能看懂并直接用上。
核心思路
我们需要遍历所有7个文件,把每个货币在不同文件里的计数存起来,最后按CSV格式输出表头和每一行的汇总数据。awk的数组非常适合做这种跨文件的数据聚合。
完整Awk脚本
把下面的代码保存成merge_currency.awk文件:
BEGIN { # 设置输出分隔符为逗号,确保是CSV格式 OFS = "," # 构建表头:先写currency,再依次添加Count_1到Count_7 header = "currency" for (i=1; i<=7; i++) { header = header OFS "Count_" i } print header } # 每个文件的第一行执行,提取当前文件的编号 FNR == 1 { # 这里假设文件名是file1、file2...file7,从文件名里提取数字 # 如果你的文件名是其他格式(比如data_01.txt),可以用下面的正则匹配方式替代: # match(FILENAME, /[0-9]+/); file_num = substr(FILENAME, RSTART, RLENGTH) file_num = substr(FILENAME, 4) } # 处理每个文件里的每一行数据(格式:计数 货币) { # 把当前货币在当前文件的计数存入二维数组 arr[$2][file_num] = $1 } END { # 遍历所有货币,输出每一行的汇总数据 for (currency in arr) { line = currency # 依次拼接每个文件的计数 for (i=1; i<=7; i++) { # 如果某个文件没有该货币(题目说不会出现,但保险起见),可以改成arr[currency][i]+0输出0 line = line OFS arr[currency][i] } print line } }
怎么运行脚本
在终端里执行下面的命令,把7个文件作为参数传入,输出结果保存到summary.csv:
awk -f merge_currency.awk file1 file2 file3 file4 file5 file6 file7 > summary.csv
脚本细节解释
- BEGIN块:在处理任何文件前运行,负责设置CSV的分隔符,生成并打印表头。
- FNR == 1:每个文件的第一行触发,用来识别当前处理的是第几个文件,这样我们才能把计数对应到Count_1到Count_7的列里。
- 数据处理行:把每一行的计数和货币对应起来,存到二维数组
arr中,arr[货币][文件编号] = 计数。 - END块:所有文件处理完后,遍历每个货币,把它在7个文件里的计数拼接成一行,打印出来。
适配不同文件名
如果你的文件名不是file1这种简单格式,比如是currency_data_1.csv,可以把提取文件编号的代码改成正则匹配:
FNR == 1 { match(FILENAME, /[0-9]+/) file_num = substr(FILENAME, RSTART, RLENGTH) }
这样不管文件名里的数字在哪里,都能准确提取出来。
内容的提问来源于stack exchange,提问作者Shlshgaikwad
相关产品推荐
相关产品推荐

