linux - 使用 bash 处理大量数据

标签 linux bash unix awk bigdata

我必须使用 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 脚本编写秘诀和 Arnold Robins 的 Effective Awk Programming,第 4 版。

关于linux - 使用 bash 处理大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33974374/

相关文章:

在 Linux 和 Windows 中用 C 语言编码。任何适当的面向调试的以 C 为中心的 IDE?

linux - 将测试从 Windows 转移到 Linux 服务器 - Selenium

git - 您如何使用存储删除然后恢复非索引更改,而不会在 git 中发生 merge 冲突?

linux - Ansible 执行脚本不起作用

unix - 以不同语言打印大纪元时间

linux sed 命令 - 在 csv 行的每一端添加字符串

linux - 搜索和替换(多行)

c - 在 OpenGL C Linux 中移动特定对象

regex - 用于货币的 Linux sed 正则表达式

unix:///tmp/supervisor.sock 没有这样的文件