根据特定列中的单词集过滤行

根据特定列中的单词集过滤行

具有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

从这个文件中,我想过滤column1,其中条件是column1值应该由给定的单词集组成,在这种情况下(last,name,nm,lst,-,_,[0-9])并排除如果包含任何也就是说。并将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 awkgensub可用于删除所有这些单词,如果为空则打印:

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

sub与/不同gsubgensub保留原始记录不变并返回结果字符串。awk通过将字段复制到变量中,可以将相同的方法用于标准。

要包含比 多的字符[0-9_-],您可以使用[^[:alpha:]](ie 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记录

相关内容