linux – 使用bash处理大量数据
发布时间:2020-12-13 23:52:03 所属栏目:Linux 来源:网络整理
导读:我必须使用bash脚本处理文件夹中的大量txt文件. 每个文件包含数百万行,它们的格式如下: 档案#1: en ample_1 200it example_3 24ar example_5 500fr.b example_4 570fr.c example_2 39en.n bample_6 10 档案#2: de example_3 4uk.n example_5 50de.n examp
我必须使用bash脚本处理文件夹中的大量txt文件.
每个文件包含数百万行,它们的格式如下: 档案#1: en ample_1 200 it example_3 24 ar example_5 500 fr.b example_4 570 fr.c example_2 39 en.n bample_6 10 档案#2: de example_3 4 uk.n example_5 50 de.n example_4 70 uk example_2 9 en ample_1 79 en.n bample_6 1 … 我必须通过“en”或“en.n”进行过滤,在第二列中找到重复的出现次数,求和第三列并得到如下的排序文件: en ample_1 279 en.n bample_6 11 我的脚本在这里: #! /bin/bash clear BASEPATH=<base_path> FILES=<folder_with_files> TEMP_UNZIPPED="tmp" FINAL_RES="pg-1" #iterate each file in folder and apply grep INDEX=0 DATE=$(date "+DATE: %d/%m/%y - TIME: %H:%M:%S") echo "$DATE" > log for i in ${BASEPATH}${FILES} do FILENAME="${i%.*}" if [ $INDEX = 0 ]; then VAR=$(gunzip $i) #-e -> multiple condition; -w exact word; -r grep recursively; -h remove file path FILTER_EN=$(grep -e '^en.n|^en ' $FILENAME > $FINAL_RES) INDEX=1 #remove file to free space rm $FILENAME else VAR=$(gunzip $i) FILTER_EN=$(grep -e '^en.n|^en ' $FILENAME > $TEMP_UNZIPPED) cat $TEMP_UNZIPPED >> $FINAL_RES #AWK BLOCK #create array a indexed with page title and adding frequency parameter as value. #eg. a['ciao']=2 -> the second time I find "ciao",I sum previous value 2 with the new. This is why i use "+=" operator #for each element in array I print i=page_title and array content such as frequency PARSING=$(awk '{ page_title=$1" "$2; frequency=$3; array[page_title]+=frequency }END{ for (i in array){ print i,array[i] | "sort -k2,2" } }' $FINAL_RES) echo "$PARSING" > $FINAL_RES #END AWK BLOCK rm $FILENAME rm $TEMP_UNZIPPED fi done mv $FINAL_RES $BASEPATH/06/01/ DATE=$(date "+DATE: %d/%m/%y - TIME: %H:%M:%S") echo "$DATE" >> log 一切正常,但执行需要很长时间.有没有人知道如何获得相同的结果,更少的时间和更少的代码行? 解决方法
UNIX shell是一个操作文件和进程以及对工具进行调用的环境. shell调用操作文本的UNIX工具是awk所以只需使用它:
$awk '$1~/^en(.n)?$/{tot[$1" "$2]+=$3} END{for (key in tot) print key,tot[key]}' file | sort en ample_1 279 en.n bample_6 11 你的脚本有很多问题无法评论,这表明你是shell编程的初学者 – 获得由Chris Johnson撰写的Bash Shell Scripting Recipes和Arnold Robins的Effective Awk Programming,第4版. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |