1

一致する場合は、いくつかのパターンに一致する必要があります。次のいくつかの単語を出力する必要があります。一致する条件は 3 つしかありません…しかし、最初の条件を満たした後に来る単語だけを出力する必要があります。 .

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
4

2 に答える 2

3

このようにネストされたifs が複数ある場合、中括弧を使用して完全に明確にすることが非常に重要です。私はあなたのコードを書き直そうとしました。

  • -v引用符で遊ぶ代わりに、シェル変数を awk に渡すために使用します
  • 空白はあなたの友達です。というか、あなたのコードを保守しなければならない次の人の友達です。
  • スクリプトの 8 行目のいくつかのエラーを修正しました
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
于 2013-05-28T16:43:22.270 に答える
0

Glenn のバージョンは少し改善されました。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
于 2013-05-28T20:43:18.343 に答える