2014-12-22 33 views
-1

我正在寻找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)行中执行此脚本时遇到了麻烦。

有上面相同的结果

回答

0

你尝试过用grep脚本的一部分执行的任何更好的办法?

grep [options] PATTERN [FILE...] 
+0

你是说我应该将不同的模式重定向到不同的文件以便制作小文件? –

+0

如果你正在寻找一个文件行中的SEG_NBR,你可以使用'grep SEG_NBR filenamehere.txt',它会给你所有在其中有SEG_NBR的行。 –

+0

SEG_NBR出现在文件的每一行,但是我们不知道SEG_NBR是3还是4或5.So你是否想说我应该将不同的SEG_NBR模式指向不同的文件,这将有助于创建小文件从而使搜索容易? –

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表示要总结的价值,这是对文件中的第五(第5)场,我会用这个

值求和
 sum_of_detail_rcds+=$5 

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

IHTH

+0

$ o是什么解决方案? –

+0

这是数据的“整行”,注意这是一个零字符'0',而不是一个小写字母。 – shellter

+0

我明白了你的观点,但假设我需要像下面提到的那样剪切16-25字符TOT_NUM_OF_DTL_RCDS_FILE ='echo“$ {LINE}”| cut -c 33-40'和LINE是(cat $ FILE_PROC | while read LINE),那么如何使用awk –

相关问题