内容を含むファイルが提供されます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」です。各結果には長さがあるので0
1
0
1
模様条件は無条件で真と見なされます。この時に{
行動 }
トリガーされprint "match: "$0
実行されます。
問題を解決しましょう。
awk
(参考資料を参照)の文書を読むと、構造が小文字であることがman awk
わかります。さらに、内部以外にはこれらの構造を使用することはできません。 «if
else
{
行動 }
»各ドア部分。
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
大文字ではありません。
より多くのケースを見つけることができますここ。