私のコマンドが間違った出力を提供するのはなぜですか?

私のコマンドが間違った出力を提供するのはなぜですか?

列1に数値がある場合、行を出力しようとしましたが、機能しません。私のサンプルファイルには列1に数字がないので、この場合、awkは何も返すべきではありませんか?

私のコード

awk -F 'BEGIN {OFS=FS}{ if ( ( $2 ~/aaa/ || $2 ~/bbb/ || $2~/ccc/) && $1 ~ "[[:digit:]]$")print}' file

猫ファイル

8F3FTO|aaa|278346|
TYF98|bbb|89237|
YUG198|ccc|29834|
aljs23456|ccc|241298|

私のコードが返されます。

aljs23456|ccc|241298

答え1

コピー - 貼り付けエラーではない場合は、実際には|フィールド区切り文字として指定されていません。あなたはそれを使用しなければなりません-F'|'

さらに、4つの入力行はすべて1列に1つ以上の数字を持ちます。また、列 1 には数値以外の項目も含まれています。数字のみを含む1行目を一致させるには、を使用します^[[:digit:]]+$

ちなみに、スクリプトで実行できる最適化がたくさんあります。例えば

awk -F'|' 'BEGIN {OFS=FS}; $2 ~ /aaa|bbb|ccc/ && $1 ~ "^[[:digit:]]+$"' file

ifawk ステートメントは通常、次の形式をとるので、そうする必要はありませんpattern {action}(どちらもオプションです)。パターンのない演算はすべての入力行に対して行われ、演算のない演算は一致するprintすべての行に対して行われます(print これはパターンがtrueと評価されたときのデフォルトの動作であるため、文は1完全な文で共通です。慣用語同義語{print}- " 1" は true と評価されるため、print基本操作を実行します。

または、$ 2に対してaaa、bbb、またはcccの正確な一致が必要な場合(たとえば、aaabまたはなどの項目と一致しないfoocccbar):

awk -F'|' 'BEGIN {OFS=FS}; $2 ~ /^(aaa|bbb|ccc)$/ && $1 ~ "^[[:digit:]]+$"' file

関連情報