linux里awk处理多个文件内容,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

我希望有这样的输出:

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

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=

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脚本,它生成一个带有我所有键的排序文件,它非常庞大,大约有6200万条记录,我将这个文件分成几块,然后将每个文件传递给我的awk脚本.

BASH:

#! /bin/bash

clear

FILENAME=

BASEPATH=

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我预先分配我的最终数组,并读取数据集/ *文件夹我填充其内容.

我已经发现我的瓶颈来自于通过awk输入迭代数据集文件夹(10个文件,每个文件有16.000.000行).

一切都在处理一小组数据,但是对于真实数据,RAM(30GB)拥挤不堪.有没有人有任何建议或意见?谢谢.

解决方法:

$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", OFS, 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}.如有必要,将输出通过管道排序.

标签:bash,unix,linux,awk,bigdata

来源: https://codeday.me/bug/20190609/1202311.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值