我需要匹配一些模式如果它匹配我需要打印下几个单词到它..我只有三个这样的条件匹配...但我只需要打印满足第一个条件后出现的那些单词。 。iez ..
虽然在LLL SSS之前我有TTT,但我只需要打印LLL SSS之后的那些到AAA RRR,并且当我遇到LLL SSS需要做同样的事情时,我已经尝试声明一个awk标志变量,但是它似乎不起作用。请帮助我。
var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR";
awk -v flag=1 '{
for (m=1;m<=NF;m++)
if($m~m/'$var1'/ && $(m+1)~/'$var2'/)
print "ABCD: ", $(m+2),$(m+3),$(m+4)
{flag=0};
else {
if {flag==0 && $m~/'var3'/)
print "EFG : ", $(m+1);
else {
if (flag==0 && $m~/'$var4'/ && $(m+1)~/'var5'/)
print "HIJ: ",$(m+2),$(m+3)
{flag=1};
}
}
}
}' fliename
我的文件是这样的:
AAA RRR H I
DDDD OOO HI J UGC RR
TTT YYY
LLLLL IIIIII
LLL SSS A B C D
N
DDDD TTT EFG
BBB AAA RRR J K
HHHHHH RRRRRR
LLL SSS E H G H
N
DDDD TTT EFG
UUUUU BBB AAA RRR J K
答案 0 :(得分:3)
当你有多个这样的嵌套if
时,使用大括号来完全明确是非常重要的。我试图重写你的代码。
-v
将shell变量传递给awk而不是使用引号var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR";
awk -v flag=1 \
-v var1="$var1" \
-v var2="$var2" \
-v var3="$var3" \
-v var4="$var4" \
-v var5="$var5" \
'{
for (m=1; m<=NF; m++) {
if ($m ~ var1 && $(m+1) ~ var2) {
print "ABCD: ", $(m+2),$(m+3),$(m+4)
flag=0
}
else {
if (flag == 0 && $m ~ var3) {
print "EFG : ", $(m+1)
}
else {
if (flag == 0 && $m ~ var4 && $(m+1) ~ var5) {
print "HIJ: ",$(m+2),$(m+3)
flag=1
}
}
}
}
}' fliename
答案 1 :(得分:0)
格伦的版本有所改善。我否定了flag
因此可以跳过初始化。
var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR";
awk -v var1="$var1" -v var2="$var2" -v var3="$var3" -v var4="$var4" -v var5="$var5" \
'!flag {
for (m=1; m<=NF-1; ++m)
if ($m == var1 && $(m+1) == var2) {
print "ABCD: ", $(m+2),$(m+3),$(m+4)
flag=1
next
}
}
flag {
for (m=1; m<=NF-1; ++m)
if ($m == var3) {
print "EFG : ", $(m+1)
break
} else {
if ($m == var4 && $(m+1) == var5) {
print "HIJ: ",$(m+2),$(m+3)
flag=0
break
}
}
}' filename
输出:
ABCD: A B C
EFG : EFG
HIJ: J K
ABCD: E H G
EFG : EFG
HIJ: J K
或者您甚至可以尝试纯粹的bash版本:
var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR";
found=0;
while read -a a; do
if [ $found -eq 0 ]; then
for((i=0;((i+1))<${#a[*]};++i)) {
[ ${a[$i]} == $var1 -a ${a[((i+1))]} == $var2 ] &&
echo ABCD: ${a[((i+2))]} ${a[((i+3))]} ${a[((i+4))]} &&
found=1 && break
}
else
for((i=0;((i+1))<${#a[*]};++i)) {
[ ${a[$i]} == $var3 ] && echo EFG: ${a[((i+1))]} && break
[ ${a[$i]} == $var4 -a ${a[((i+1))]} == $var5 ] && found=0 &&
echo HIJ: ${a[((i+2))]} ${a[((i+3))]} && break
}
fi
done <filename