我正在为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 :(得分:0)
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