awkで2つの条件セットを選択してください。

awkで2つの条件セットを選択してください。

私にテーブルがあります。

1 1
1 0
0 1
0 0

次の2つの選択基準セットを使用して行を印刷したいと思います。または

標準セット1:(列1> = 1および列2 = 0)

または

標準セット2:(列1 = 0、列2> = 1)

予想される出力は次のとおりです。

1 0
0 1

似たようなことを書いていません。

awk '($1>=1 && $2=0)||($1=0 && $2>=1) {print $0}'

問題は何ですか?

答え1

問題は、=同等性テスト()の代わりに割り当て演算子()を使用していることです==。何かにゼロを割り当てたブール結果は「false」です。これがテストが成功しない理由です。


一般的なawkコマンドは

awk '($1 >= 1 && $2 == 0) || ($1 == 0 && $ 2 >= 1)'

{ print $0 }これは、ジョブがないすべての条件に対するデフォルトのジョブであるため、必要ありません。

最初の列と2番目の列で同じ値を持つ行だけをスキップしたい場合(与えられたデータに対して同じ出力を提供):

awk '$1 != $2'

どちらの場合も、出力は次のようになります。

1 0
0 1

答え2

awk比較する=のではなく、コマンドで使用するときに発生する問題に加えて、==先行は達成するのが難しい 指摘。あなたの入力と使用中のコマンドを通して私が理解している限り、少なくとも1つがゼロの場合、この行が必要です。

負の値がないと仮定すると、次のようになります。

awk '($1 && !$2) || (!$1 && $2)' infile

または、より短く-使用することもできます。

awk '($1 * !$2) + (!$1 * $2)' infile

答え3

代替egrepソリューション:

egrep '^([1-9][0-9]* *0|0 *[1-9][0-9]*)$' file

出力:

1 0
0 1

答え4

ORを使用する必要はありません。その間にさらに基準を追加することもできます。各基準を別々の行に追加し、「criteria.awk」などのテキストファイルに保存してから、次のように実行します。 awk -f ベース .awktable.dat

awkscriptファイルの内容は次のとおりです。

{
    if ($1 >= 1 && $2 == 0) print $0;
    if($1 == 0 && $2 >=1) print $0;
}

関連情報