【问题标题】:ShellScript: grep+while+cut+awk in a large file = very slowShell 脚本:大文件中的 grep+whole+cut+awk = 非常慢
【发布时间】:2011-12-23 14:01:35
【问题描述】:

我有这个脚本在一个 1.7GB 的文本文件中运行。

#!/bin/bash

File1=$1.tmp
File2=$1.modified

grep '^#' $1 > $File2
grep -v '#' $1 > $File1

while read line; do
        column_four=$(echo $line | cut -d " " -f4)
        final_line=$(echo $line | cut -d " " -f4-5)
        if [ "$column_four" == "0" ]; then
               beginning_line=$(echo $line | cut -d " " -f1-3)
               final_line=$(echo $line | cut -d " " -f4-5)
        else
               final_line=$(echo $line | cut -d " " -f1-2)
        fi
        linef=$(echo "$beginning_line $final_line")
        echo $linef | awk '{printf "%5.0f%12.4f%12.4f%5.0f%12.4f\n", $1, $2, $3, $4, $5}' >> $File2
done < $File1
rm -f $File1

问题:它非常非常慢。它使用 Core2Duo 创建一个新文件,其列以每分钟 200KB 的速度排列。我怎样才能让它更快?

谢谢。

【问题讨论】:

  • 请发布您的输入文件示例和预期/期望输出示例。

标签: shell awk grep while-loop


【解决方案1】:

我会取消循环并使用一次 awk 调用:

awk '
{
    if ($4 == 0) {
       f1 = $1;
       f2 = $2;
       f3 = $3;
       f4 = $4;
       f5 = $5;
    } else {
       f4 = $1;
       f5 = $2;
    }
    printf ("%5.0f%12.4f%12.4f%5.0f%12.4f\n", f1, f2, f3, f4, f5);
}' < $File1 >> $File2

这样您就不会在输入文件的每一行多次调用awkechocut,而只是运行一个awk 进程。

【讨论】:

  • 您忘记过滤掉以# 开头的行了,但那将是微不足道的添加。
  • @JanHudec:该行只是作为 while 循环的替代品,但我的回答不是很清楚。
  • 但它也可以代替 grep。在{} 块之前可以有一个正则表达式可以处理它。
  • Khm,你不需要cat(在这种情况下作为另一个无用的进程),因为awk 可以处理文件,而不仅仅是STDIN :-)
  • @ZsoltBotykai:我删除了cat,尽管我更喜欢输入和输出重定向而不是让 awk 直接处理文件,因为我认为生成的代码更简单。但这只是个人喜好。
【解决方案2】:

据我所知,您可以在 awk 中查看全部内容,类似于

awk '/^#/ { print $0 >> "File2" ; getline}
     $0 ! ~ /#/ { if ( $4 == 0 ) { 
                  f1 = $1 ; f2 = $2 ; f3 = $3
                  printf("%5.0f%12.4f%12.4f%5.0f%12.4f\n", f1, f2, f3, $4, $5) >> "File2" }
                  else { printf("%5.0f%12.4f%12.4f%5.0f%12.4f\n", f1, f2, f3, $1, $2) >> "File2" }
                      } INPUTFILE

【讨论】:

  • 不要认为这在功能上是等效的,因为 shell 代码仅在第 4 列为“0”时重置 $beginning_line 变量,否则重用这些值。
  • @beny23 你说得对,我错过了。更新答案(与您的答案几乎相同)。
猜你喜欢
  • 2022-11-30
  • 2017-03-15
  • 1970-01-01
  • 2019-04-30
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 2015-02-23
相关资源
最近更新 更多