我有一个文件需要处理并从中获取一些条目。文件格式为:
输入示例:
String1:"Hello"
String2:"World"
String3:"Question"
End
String1:"HelloAgain"
String5:"Answer"
End
String1:"NewEntry"
String2:"Foo"
String5:"NewFile"
End
脚本将迭代并尝试找到 String1 并打印它,如果 String2 也存在于该块中,则将其附加到 String1 并打印。
示例输出:
Hello World
HelloAgain
NewEntry Foo
我需要循环遍历每个这样的块。这里的块的意思是每个“End”字符串之间的内容。我有一个像这样的脚本:
cat $1 | while read line
do
if [[ $line == "String1="* ]];
then
string1=$line
fi
if [[ $line == "String2="* ]];
then
string2=$line
fi
if [[ $line == "End" ]];
then
if [ $string1 ];
then
echo "string1/"$string1"
fi
if [ $string1 ] && [ $string2 ];
then
echo $string1" "$string2
fi
#Reset values
string1=''
string2=''
fi
done
该代码工作正常,但这些块之间的处理可能会变得更加复杂,迭代这些块并处理这些块条目的最佳方法是什么。
注意:该文件是一种属性文件。
答案1
鉴于您提供的输入和请求的输出:
$ awk -F: '$0 == "End" { printf "\n" } $1 ~ /^String[12]$/ { gsub( /\"/, "", $2 ); printf( "%s ", $2)}' input
Hello World
HelloAgain
NewEntry Foo
答案2
perl -F':|"' -lane 'if ($out && $_ eq "End") {print "$out"; $out=""};
$out = $F[2] if ($F[0] eq "String1");
$out .= $F[2] if ($out && $F[0] eq "String2")' input.txt
此 perl 脚本使用:
或"
作为字段分隔符,以避免需要从输出中删除双引号。这意味着我们需要提取第三字段而不是第二个字段,因为现在第一个字段:
和"
. Perl 数组是从零开始的,所以那就是$F[2]
.
如果有东西要打印,它只打印记录(“块”)的输出,无论是 String1 本身或者String1 和 String2 存在 - 即它不会为不匹配的记录打印空行。
这是相同的算法awk
:
awk -F':|"' 'out && $0 == "End" { print out; out="" };
$1 == "String1" { out=$3 };
out && $1 == "String2" { out = out$3 }' input.txt