如何缩短读取数千行文件-bash脚本的时间?

时间:2018-08-26 08:04:50

标签: bash shell

文件中有数千行,需要逐行读取直到模式匹配。示例:

1
2
3
pattern 1
pattern 2
pattern 1
pattern 2
....thousand lines here
pattern 3 - pass or fail
...thousand line
...repeat pattern 1, 2, 3

如果通过模式3的值,则模式1和2将存储在数组中,如果失败,则该值将被忽略。模式3将始终出现在模式1和2之后。以下是我用bash脚本编写的代码:

while read -r line
    do


        if [[ $line= 'Pattern 1' ]]; then
            ID1=$line
        else if [[ $line='Pattern 2']]; then 
            ID2=$line
        else if [[$line='Pattern 3']]; then
            VALUE=`echo $line | cut -d '|' -f 4`
            if [[ $VALUE='Pass' ]];then
            Pattern1+=($ID1)
            Pattern2+=($ID2)
            fi
         else
       echo "do nothing"
       fi


        fi              
    done <<< file.txt

但是,此方法需要花费一些时间来处理文件的数千行,并且似乎无法正常工作。如何缩短处理时间和代码可以正常工作?

1 个答案:

答案 0 :(得分:1)

更新后的答案

似乎您的字段用竖线符号(|)隔开,因此您可以使用以下命令告诉awk

awk -F'|'  '...script...'

似乎倒数第二个字段中的通过/失败信号是PF,因此您可以像这样测试Pass

awk -F'|'  '$(NF-1)=="P" /print/' file

所以我想你想要类似的东西:

awk -F'|' '
     /Pattern1/             {id1=$0}
     /Pattern2/             {id2=$0}
     /^QA/ && $(NF-1)=="P"  {print id1; print id2}' file.txt

原始答案

未经测试,因为我仅在iPhone上使用,只是为了帮助您入门:

awk '/Pattern1/           {id1=$0}
     /Pattern2/           {id2=$0}
     /Pattern3/ && /pass/ {print id1; print id2}' file.txt

也许可以将它们放在单个数组中,并使用简单的bash for循环在第二个元素上拆分该数组。

您可以使用以下方法在bash脚本中的数组中获取该信息:

#!/bin/bash
#
echo I am a bash script
#
# Fill bash array using awk
arr=( $(awk ... file.txt) )