linux – 使用awk处理多个文件

linux – 使用awk处理多个文件,第1张

概述我必须使用awk处理大量的txt文件(每个文件有1600万行).我必须阅读例如十个文件: 档案#1: en sample_1 200en.n sample_2 10en sample_3 10 档案#2: en sample_1 10en sample_3 67 文件#3: en sample_1 1en.n sample_2 10en sample_4 20 … 我希望有这样的输出: 我必须使用awk处理大量的txt文件(每个文件有1600万行).我必须阅读例如十个文件:

档案#1:

en sample_1 200en.n sample_2 10en sample_3 10

档案#2:

en sample_1 10en sample_3 67

文件#3:

en sample_1 1en.n sample_2 10en sample_4 20

我希望有这样的输出:

source Title f1 f2 f3 sum(f1,f2,f3)

en sample_1 200 10 1 211en.n sample_2 10 0 10 20en sample_3 10 67 0 77en sample_4 0 0 20 20

这是我的第一个代码版本:

#! /bin/bashclear#var declarationBASEPATH=<path_to_file>YEAR="2014"RES_FolDER="processed"FINAL_RES="2014_06_01"#results folder creationmkdir $RES_FolDER#processingawk 'NF>0{a[" "]=a[" "]" "}END{for(i in a){print i a[i]}}' $BASEPATH/$YEAR/* > $RES_FolDER/$FINAL_RES

在这里我的输出:

en sample_1 200 10 1en.n sample_2 10 10en sample_3 10 67en sample_4 20

我对如何在没有找到事件的地方放置零列以及如何获得所有值的总和有点困惑.
我知道我要用这个:

{tot[" "]+=} END{for (key in tot) print key,tot[key]}

希望有人会帮忙.谢谢.

********编辑********

我试图以不同的方式实现我的结果.
我创建了一个像这样的bash脚本,它生成一个带有我所有键的排序文件,它非常庞大,大约有6200万条记录,我将这个文件分成几块,然后将每个文件传递给我的awk脚本.

BASH:

#! /bin/bashclearfilename=<result>BASEPATH=<base_path>mkdir processed/slicecat $BASEPATH/dataset/* | cut -d' ' -f1,2 > $BASEPATH/processed/aggrsort -u -k2 $BASEPATH/processed/aggr > $BASEPATH/processed/sortedsplit -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/$filenamedoneecho $(date "+END PROCESSING DATE: %d/%m/%y - TIME: %H:%M:%s")rm $BASEPATH/processed/aggrrm $BASEPATH/processed/sortedrm -rf $BASEPATH/processed/slice

AWK:

BEGIN{while(getline < filename){ key=" "; sources[key]; for(i=1;i<11;i++){   keys[key"-"i] = "0"; }}close(filename);}{if(FNR==1){ ARGIND++;}key=" ";keys[key"-"ARGIND] = }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我预先分配我的最终数组,并读取数据集/ *文件夹我填充其内容.
我已经发现我的瓶颈来自于通过awk输入迭代数据集文件夹(10个文件,每个文件有16.000.000行).
一切都在处理一小组数据,但是对于真实数据,RAM(30GB)拥挤不堪.有没有人有任何建议或意见?谢谢.

解决方法
$cat tst.awk{    key = " "    keys[key]    val[key,ARGIND] = }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 file3en sample_4 0 0 2020en.n sample_2 10 0 1020en sample_1 200 10 1211en sample_3 10 67 077

以上使用GNU awk作为ARGIND,其他awks只是在开始时添加一行FNR == 1 {ARGIND}.如有必要,将输出通过管道排序.

总结

以上是内存溢出为你收集整理的linux – 使用awk处理多个文件全部内容,希望文章能够帮你解决linux – 使用awk处理多个文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1023908.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存