私にテーブルがあります。
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;
}