如何最大限度地减少搜索大文件的时间

时间:2014-12-22 18:35:04

标签: unix

我正在为Unix中的下述代码寻找更好的解决方案。

cat $FILE_PROC | while read LINE
  do
    SEG_NBR=`echo $LINE | cut -c 1-1`

       if [ "${SEG_NBR}" == "3" ] ; then
               echo "Logical level header is identified"
               #COUNT_DETAIL_SEG=0

       elif [ "${SEG_NBR}" == "4" ] ; then
                   COUNT_DETAIL_SEG=`expr ${COUNT_DETAIL_SEG} + 1`
                   SUM_OF_DETAIL_RCDS=${COUNT_DETAIL_SEG}
                   echo "Sum of detail records is $SUM_OF_DETAIL_RCDS"

       fi

在上面提到的代码中,Cat命令在每行文件中查找某个SEG_NBR。 我在大文件(例如565656)行中执行此脚本时遇到麻烦。

有没有更好的方法来执行具有相同结果的脚本的上述部分

2 个答案:

答案 0 :(得分:0)

你尝试过使用grep吗?

grep [options] PATTERN [FILE...]

答案 1 :(得分:0)

对处理的每一行使用命令替换对于快速处理文件来说非常昂贵。

虽然您没有提供示例输入或预期输出,但我认为awk脚本是针对此问题的更好(更快处理)的解决方案。以下是基于代码中嵌入的逻辑的一般指南。

awk '{
    if (substr($0,1,1) == "3" ) {  
       print "Logical level header is identified"
    }
    else if (substr($0,1,1) == "4") { 
       count_detail_seg++
       sum_of_detail_rcds=count_detail_seg
       print "Sum of detail records is " sum_of_detail_rcds
    }
 }' $FILE_PROC

请注意您的代码

COUNT_DETAIL_SEG=`expr ${COUNT_DETAIL_SEG} + 1`
每次匹配“4”时,

将COUNT_DETAIL_SEG递增1。

count_detail_seg++ 

是awk中该表达式的快捷版本。

你为什么要这样做

 SUM_OF_DETAIL_RCDS=${COUNT_DETAIL_SEG}

?这只是复制了您已经存储在COUNT_DETAIL_SEG

中的值

如果需要真正的SUM_OF_DETAILS,则必须在文件中标识具有要为其创建SUM的记录值的位置。如果您的数据行看起来像

 4<T>ABC Company<T>12345<T>USD<T>99.99

然后作为tab分隔的记录,其中99.99代表您想要求和的值,这是文件的第五个(第五个)字段,我将用这个值求和

       sum_of_detail_rcds+=$5

在下一个问题中,请包含一小组样本数据,以及来自相同数据的所需输出。还包括您当前输出的内容以及您获得的任何错误消息的复制/粘贴。

IHTH