文件中有数千行,需要逐行读取直到模式匹配。示例:
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
但是,此方法需要花费一些时间来处理文件的数千行,并且似乎无法正常工作。如何缩短处理时间和代码可以正常工作?
答案 0 :(得分:1)
更新后的答案
似乎您的字段用竖线符号(|
)隔开,因此您可以使用以下命令告诉awk
:
awk -F'|' '...script...'
似乎倒数第二个字段中的通过/失败信号是P
或F
,因此您可以像这样测试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) )