条件がある場合 AWK

条件がある場合 AWK

内容を含むファイルが提供されますinput.txt

xyMnZnMs76XHgsWJ
size: YN3hxFqFeUxXUMrQ
USPqYEnbquwFhUW7
vhJJduHZu25qHzTw
size: JaTDhQYQtLRWBLjj
uE5HGDAZN6DHU73Q
QxVPfQQaKTgR9LXQ
grnsm8bwSz5fJbQS size:
7CcuZxCHSJYhcdqg
ZuWadAaLWFwDwj5Z

使用する方法if (condition) {...} else {...}?

私は以下を使用しようとしています:

awk -F ':' '
IF ($1 ~ /size/) {
    print "match: "$0;
} ELSE {
    print "non-match: "$0;
}' input.txt

ただし、すべての行は一致します($1を含まない行も含む"size")。

match: xyMnZnMs76XHgsWJ
match: size: YN3hxFqFeUxXUMrQ
match: USPqYEnbquwFhUW7
match: vhJJduHZu25qHzTw
match: size: JaTDhQYQtLRWBLjj
match: uE5HGDAZN6DHU73Q
match: QxVPfQQaKTgR9LXQ
match: grnsm8bwSz5fJbQS size:
match: 7CcuZxCHSJYhcdqg
match: ZuWadAaLWFwDwj5Z

私の予想結果は次のとおりです。

non-match: xyMnZnMs76XHgsWJ
match: size: YN3hxFqFeUxXUMrQ
non-match: USPqYEnbquwFhUW7
non-match: vhJJduHZu25qHzTw
match: size: JaTDhQYQtLRWBLjj
non-match: uE5HGDAZN6DHU73Q
non-match: QxVPfQQaKTgR9LXQ
non-match: grnsm8bwSz5fJbQS size:
non-match: 7CcuZxCHSJYhcdqg
non-match: ZuWadAaLWFwDwj5Z

答え1

説明しましょう。

の文法構造はawk次のとおりです。 «模様 { 行動 }»、2つのコンポーネントのうちの1つ(両方ではない)はオプションです。作成時にキーワードをIF ($1 ~ /size/) { print "match: "$0; }使用する代わりに、if実際には空の文字列(未設定の変数IF)とor()$1 ~ /size/で評価される式を連結します。文字列の連結のため、結果は文字列( ""または "")として扱われ、長さがゼロ以外の場合は「true」です。各結果には長さがあるので0101模様条件は無条件で真と見なされます。この時に{ 行動 }トリガーされprint "match: "$0実行されます。

問題を解決しましょう。

awk(参考資料を参照)の文書を読むと、構造が小文字であることがman awkわかります。さらに、内部以外にはこれらの構造を使用することはできません。 «ifelse{ 行動 }»各ドア部分。

awk -F: '
    { if ($1 ~ /size/) { print "match:", $0 } else { print "non-match:", $0 } }
' input.txt

ただし、行は目的のgrnsm8bwSz5fJbQS size:出力では一致しないと見なされますが、このコードでは一致する出力と見なされます。これは、正規表現が/size/コロンで区切られた最初のフィールドと一致するためですgrnsm8bwSz5fJbQS size。正確に一致させるには、文字列の始まりと終わりを識別する必要がありますが、より良い方法はリテラル文字列で比較することです。

awk -F: '
    { if ($1 == "size") { print "match:", $0 } else { print "non-match:", $0 } }
' input.txt

または、

awk -F: '
    $1 != "size" { print "non-match:", $0 }
    $1 == "size" { print "match:", $0 }
' input.txt

でも、

awk -F: '
    $1 != "size" { printf "non-" }
    { print "match:", $0 }
' input.txt

答え2

私はこれにaを使用しませんif-statement。彼らはより複雑なもののためのものです。以下を使用できます。

awk -F':' '/^size/ {print "match: " $0} !/^size/ {print "non-match: " $0}' input.txt

patまたは、私が好む方法は、後でより簡単に変更できるように、名前付き変数を使用してこれを行うことです。

awk -v pat="size" -F':'  '$1~pat {print "match: " $0}; $1!~pat {print "non-match: " $0}' input.txt

答え3

これは私にとって効果的です。
awk -F: '{if ($1 =="size") {print "match: "$0} else {print "non-match: "$0}}'

の場合は、awk常にコードに中括弧を使用する必要があります。たとえば、次のようになります。

awk '{ your code }'

また、if/はelse大文字ではありません。
より多くのケースを見つけることができますここ

関連情報