如何在同一字符的两次出现之间打印行?
How to print lines between two occurrences of the same character?
我有以下格式的非常大的文本文件:
>randomheader1 some info flag1
data
moredata
someextradata
>randomheader2 some info flag2
littledata
somedata
>randomheader3 some info flag1
one
two
three
four
>randomheader4 some info flag3
....
我想将包含 flag1
的行之后的行输出到另一个文件中,例如:
>randomheader1 some info flag1
data
moredata
someextradata
>randomheader3 some info flag1
one
two
three
four
我一直在阅读以寻找解决方案,我检查了 ,但是由于我正在寻找的匹配模式是相同的字符(即 >
),所以它没有工作。我正在 bash.
中寻找解决方案
使用 awk
awk '{if([=10=]~/^>/){ if([=10=]~/flag1/) {flag="Y"} else {flag=""}} }flag '
演示:
$cat temp.txt
>randomheader1 some info flag1
data
moredata
someextradata
>randomheader2 some info flag2
littledata
somedata
>randomheader3 some info flag1
one
two
three
four
>randomheader4 some info flag3
$awk '{if([=11=]~/^>/){ if([=11=]~/flag1/){flag="Y"} else {flag="" } }}flag ' temp.txt
>randomheader1 some info flag1
data
moredata
someextradata
>randomheader3 some info flag1
one
two
three
four
$
假设数据文件不包含任何空字符 ('\0'),纯 bash 的解决方案可能是:
$猫过滤器
#!/bin/bash
in_flag=
while IFS= read -r line; do
case $line in
\>*\ flag1) in_flag=t ;;
\>*) in_flag= ;;
esac
[[ -n $in_flag ]] && echo "$line"
done
运行 等于
./filter < datafile > outfile
我有以下格式的非常大的文本文件:
>randomheader1 some info flag1
data
moredata
someextradata
>randomheader2 some info flag2
littledata
somedata
>randomheader3 some info flag1
one
two
three
four
>randomheader4 some info flag3
....
我想将包含 flag1
的行之后的行输出到另一个文件中,例如:
>randomheader1 some info flag1
data
moredata
someextradata
>randomheader3 some info flag1
one
two
three
four
我一直在阅读以寻找解决方案,我检查了 >
),所以它没有工作。我正在 bash.
使用 awk
awk '{if([=10=]~/^>/){ if([=10=]~/flag1/) {flag="Y"} else {flag=""}} }flag '
演示:
$cat temp.txt
>randomheader1 some info flag1
data
moredata
someextradata
>randomheader2 some info flag2
littledata
somedata
>randomheader3 some info flag1
one
two
three
four
>randomheader4 some info flag3
$awk '{if([=11=]~/^>/){ if([=11=]~/flag1/){flag="Y"} else {flag="" } }}flag ' temp.txt
>randomheader1 some info flag1
data
moredata
someextradata
>randomheader3 some info flag1
one
two
three
four
$
假设数据文件不包含任何空字符 ('\0'),纯 bash 的解决方案可能是:
$猫过滤器
#!/bin/bash
in_flag=
while IFS= read -r line; do
case $line in
\>*\ flag1) in_flag=t ;;
\>*) in_flag= ;;
esac
[[ -n $in_flag ]] && echo "$line"
done
运行 等于
./filter < datafile > outfile