특정 열의 단어 집합을 기준으로 행 필터링

특정 열의 단어 집합을 기준으로 행 필터링

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기록 할 수 있습니다.

관련 정보