列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
if
awk ステートメントは通常、次の形式をとるので、そうする必要はありません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