Unix 如何尽可能缩短搜索大文件的时间

Unix 如何尽可能缩短搜索大文件的时间,unix,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 [

我正在为下面提到的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。 在大文件(例如5656行)中执行此脚本时,我遇到了麻烦


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

您是否尝试过使用grep

grep [options] PATTERN [FILE...]

对于快速处理文件而言,对处理的每一行使用命令替换是非常昂贵的

虽然您没有提供示例输入或预期输出,但我认为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”时,将计数\详细信息\ SEG增加1

是该表达式在awk中的简捷版本

你为什么这么做

 SUM_OF_DETAIL_RCDS=${COUNT_DETAIL_SEG}
??这只是复制了已存储在COUNT\u DETAIL\u SEG中的值

如果要获得详细信息的真实总和,则必须确定文件中具有要为其创建总和的记录值的位置。如果你看到一行数据

 4<T>ABC Company<T>12345<T>USD<T>99.99
在下一个问题中,请包含一小部分样本数据,以及来自该数据的所需输出。还包括当前输出的外观,以及收到的任何错误消息的副本/粘贴


IHTH

你是说我应该将不同的模式重定向到不同的文件以生成小文件吗?如果你在文件的一行中查找SEG_NBR,你可以使用
grep SEG_NBR filenamehere.txt
它会给你所有包含SEG_NBR的行。SEG_NBR出现在每一行文件中,但问题是我们没有知道SEG_NBR是3、4还是5。那么你是想说我应该将不同的SEG_NBR模式指向不同的文件,这将有助于创建小文件,从而使搜索更容易?是的,这会起作用,如果你能发布几行的示例,我可能会给出更好的答案。这个解决方案是$o吗?这就是答案数据的“整行”,注意这是一个零字符
0
,不是小写的o字符。我明白你的意思,但是假设我需要像下面提到的那样剪切字符16-25,TOT_numu of_DTL_RCDS_FILE=
echo“${line}”| cut-c33-40
行是(cat$FILE|PROC | while read line),那么如何使用awk
subsr($0,33,8)处理这个问题
equals
cut-c33-40
awk
是一个面向行的实用程序。对于像我定义的
{……}
awk这样的代码块,awk读取一行数据,该行数据在
$0
中可用,(并且$1有第一个字段,…等等)。当
{block}中的所有步骤
已被处理,然后读入一行新的数据,然后该过程重新开始。因此
$0
将与
$line
变量具有相同的值。祝您好运。如果[“${SEG_NBR}”==“6”];然后识别了echo“逻辑级别尾部”,您能告诉我如何处理此问题吗“LOGICAL#u FILE=
expr${LOGICAL#u FILE}+1
##缺陷1724从这里开始#DTL#u RCDS_FILE=
echo“${LINE}”| cut-c2-6
DTL#RCDS_FILE的TOT#NUM u=
echo“${LINE}cut c16-25
 4<T>ABC Company<T>12345<T>USD<T>99.99
       sum_of_detail_rcds+=$5