ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux – 使用bash处理大量数据

2019-07-27 18:50:46  阅读:244  来源: 互联网

标签:bash linux awk bigdata unix


我必须使用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版.

标签:bash,linux,awk,bigdata,unix
来源: https://codeday.me/bug/20190727/1556835.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有