特定の列の単語セットに基づいた行のフィルタリング

特定の列の単語セットに基づいた行のフィルタリング

input.csv以下があります:

field_name,field_friendly_name
LastNm,Last_Name
cntn_last_mod_wrkr_full_nm,Last_Name
contact_last_nm,Last_Name
contact_first_last_nm,Last_Name
last_english_nm,Last_Name
last_pronunciation_nm,Last_Name
last_nm,Last_Name
lead_space_last_nm,Last_Name
last_mod_usr_nm,Last_Name
lcl_last_nm,Last_Name
adobe_last_topic_nm,Last_Name
last_changed_user_nm,Last_Name
last_purchased_product_service_nm,Last_Name
last_imported_source_nm,Last_Name
submt_last_nm,Last_Name
cntct_last_nm,Last_Name
cust_submt_last_nm,Last_Name
cust_cntct_last_nm,Last_Name
last_mod_by_nm,Last_Name
last_mod_als_nm,Last_Name
last_mod_nm,Last_Name
ship_last_nm,Last_Name
billing_last_nm,Last_Name
last_upd_by_nm,Last_Name
wrkr_last_nm,Last_Name
trns_line_itm_last_chg_psn_nm,Last_Name
trns_line_itm_last_cre_psn_nm,Last_Name
trns_hdr_last_chg_psn_nm,Last_Name
altr_last_nm,Last_Name
trns_last_chg_nm,Last_Name
lastrepaction_nm,Last_Name
last_build_nm,Last_Name
LegalLastNm,Last_Name
ManagerLastNm,Last_Name
4-LastNm,Last_Name
NextLevelManagerLastNm,Last_Name
ManagerLegalLastNm,Last_Name

このファイルでは、列1の値が与えられた単語セット(この場合、姓、名前、nm、lst、-、_、[0-9])で構成される条件である列1をフィルタリングして除外したいと思います。何でも含まれています。そして、Column2を「Found」に更新します。私の検索では大文字と小文字を区別する必要があります。

LastNm,Found
last_nm,Found
4-LastNm,Found

この方法を使用していますが、動作しません。

awk -v q="'" --field-separator ',' '((tolower($1) ~ /last/) && (tolower($1) ~ /name/)) || ((tolower($1) ~ /last/) && (tolower($1) ~ /nm/)) && ($2="found") {print $1 "," $2  }' raw.csv

答え1

GNUを使用すると、awk次のgensubすべての単語を削除し、空白の場合は印刷に使用できます。

awk -F , -v OFS=, 'gensub(/last|lst|name|nm|[0-9_-]*/,"","g",tolower($1))=="" {
    $2="found";
    print $1, $2
}' file

sub/とは異なり、gsub元のgensubレコードを変更せずにそのままにして結果文字列を返します。awkフィールドを変数にコピーして、標準にも同じアプローチを使用できます。

より多くの文字を含めるには(たとえば)[0-9_-]を使用できます。[^[:alpha:]]anything that isn't a letter

last|lst|name|nm|[^[:alpha:]]

答え2

この試み、

awk -F, -v OFS=, '
{
split($1,w,/[^[:alnum:]]/);
for (i in w) {
    if (!(match(tolower(w[i]),/\<([0-9]*|last|nm|name|lastnm|lastname)\>/))) next;
}
$2="Found"; print; 
}' file

出力:

LastNm,Found
last_nm,Found
4-LastNm,Found

説明する:

  • splitフィールドは、単語リストを取得するために英数字ではなくすべての$1文字[^.]()で構成されています。[:alnum:]
  • for単語を繰り返します。
  • 言葉があればいいえ許可された単語を含む指定された正規表現を一致させ、nextレコードに移動します。
  • そのようなことが起こらない場合は、最終的に割り当てて記録する$2="Found"ことprintができます。

関連情報