linux – 使用awk处理多个文件
我必须使用awk处理大量的txt文件(每个文件有1600万行).我必须阅读例如十个文件:
档案#1: en sample_1 200 en.n sample_2 10 en sample_3 10 档案#2: en sample_1 10 en sample_3 67 文件#3: en sample_1 1 en.n sample_2 10 en sample_4 20 … 我希望有这样的输出:
en sample_1 200 10 1 211 en.n sample_2 10 0 10 20 en sample_3 10 67 0 77 en sample_4 0 0 20 20 这是我的第一个代码版本: #! /bin/bash clear #var declaration BASEPATH=<path_to_file> YEAR="2014" RES_FOLDER="processed" FINAL_RES="2014_06_01" #results folder creation mkdir $RES_FOLDER #processing awk 'NF>0{a[$1" "$2]=a[$1" "$2]" "$3}END{for(i in a){print i a[i]}}' $BASEPATH/$YEAR/* > $RES_FOLDER/$FINAL_RES 在这里我的输出: en sample_1 200 10 1 en.n sample_2 10 10 en sample_3 10 67 en sample_4 20 我对如何在没有找到事件的地方放置零列以及如何获得所有值的总和有点困惑. {tot[$1" "$2]+=$3} END{for (key in tot) print key,tot[key]} 希望有人会帮忙.谢谢. ********编辑******** 我试图以不同的方式实现我的结果. BASH: #! /bin/bash clear FILENAME=<result> BASEPATH=<base_path> mkdir processed/slice cat $BASEPATH/dataset/* | cut -d' ' -f1,2 > $BASEPATH/processed/aggr sort -u -k2 $BASEPATH/processed/aggr > $BASEPATH/processed/sorted split -d -l 1000000 processed/sorted processed/slice/slice- echo $(date "+START PROCESSING DATE: %d/%m/%y - TIME: %H:%M:%S") for filename in processed/slice/*; do awk -v filename="$filename" -f algorithm.awk dataset/* >> processed/$FILENAME done echo $(date "+END PROCESSING DATE: %d/%m/%y - TIME: %H:%M:%S") rm $BASEPATH/processed/aggr rm $BASEPATH/processed/sorted rm -rf $BASEPATH/processed/slice AWK: BEGIN{ while(getline < filename){ key=$1" "$2; sources[key]; for(i=1;i<11;i++){ keys[key"-"i] = "0"; } } close(filename); } { if(FNR==1){ ARGIND++; } key=$1" "$2; keys[key"-"ARGIND] = $3 }END{ for (s in sources) { sum = 0 printf "%s",s for (j=1;j<11;j++) { printf "%s%s",OFS,keys[s"-"j] sum += keys[s"-"j] } print " "sum } } 使用awk我预先分配我的最终数组,并读取数据集/ *文件夹我填充其内容. 解决方法$cat tst.awk { key = $1" "$2 keys[key] val[key,ARGIND] = $3 } END { for (key in keys) { sum = 0 printf "%s",key for (fileNr=1;fileNr<=ARGIND;fileNr++) { printf "%s%s",val[key,fileNr]+0 sum += val[key,fileNr] } print sum } } $awk -f tst.awk file1 file2 file3 en sample_4 0 0 2020 en.n sample_2 10 0 1020 en sample_1 200 10 1211 en sample_3 10 67 077 以上使用GNU awk作为ARGIND,其他awks只是在开始时添加一行FNR == 1 {ARGIND}.如有必要,将输出通过管道排序. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |