특정 열에 대한 패턴 일치 및 awk를 사용하여 찾은 일치 항목 업데이트에 대한 도움이 필요합니다.

특정 열에 대한 패턴 일치 및 awk를 사용하여 찾은 일치 항목 업데이트에 대한 도움이 필요합니다.

Linux에 다음 파일이 있습니다 raw.csv.

_id,field_name,field_friendly_name,purpose_of_use,category
1,customer_ip_address_nbr,,Ab,cd
2,customer_ipaddress,,Ab,cd
3,customer_ipaddress,,Ab,cd
4,Shipaddress,,Ab,cd
5,Ship_Ip_adress,,Ab,cd
6,Ipaddress,,Ab,cd
7,xyz,,Ab,cd

두 번째 열이 이 조건을 충족하는 모든 행을 인쇄하고 싶습니다.

("ip" 포함, "주소" 포함) 및 ("배송" 제외)

나는 시도했다:

awk ' $2 = ((/ip/ && addres) && !(ship)) print $1,$2,$3="IP address",$4,45 raw.csv

원하는 출력:

_id,field_name,field_friendly_name,purpose_of_use,category
1,customer_ip_address_nbr,IP address,Ab,cd
2,customer_ipaddress,IP address,Ab,cd
3,customer_ipaddress,IP address,Ab,cd
5,Ship_Ip_adress,IP address,Ab,cd
6,Ipaddress,IP address,Ab,cd

답변1

$ awk -F , 'BEGIN { OFS=FS } FNR == 1 { print; next } /[iI]p/ && /[aA]ddress/ && !/[sS]hip/ { $3 = "IP address"; print }' file
_id,field_name,field_friendly_name,purpose_of_use,category
1,customer_ip_address_nbr,IP address,Ab,cd
2,customer_ipaddress,IP address,Ab,cd
3,customer_ipaddress,IP address,Ab,cd
6,Ipaddress,IP address,Ab,cd

그러면 파일의 첫 번째 줄이 무조건 인쇄됩니다.

그런 다음 일부 패턴을 테스트하여 초기 문자 대소문자의 변형이 허용되는지 확인합니다. 테스트를 거쳐 Ship완료 ship되었으므로진짜패턴이라면아니요(및 !)과 일치합니다.

행이 모든 테스트를 통과하면 세 번째 열을 업데이트하고 수정된 행을 인쇄합니다.

일치시키려는 하위 문자열이 열 2에서 일치하는 경우오직을 클릭한 다음 해당 열의 내용에 대해 테스트를 수행합니다.

awk -F , '
    BEGIN    { OFS=FS }
    FNR == 1 { print; next }
    $2 ~ /[iI]p/ && $2 ~ /[aA]ddress/ && $2 !~ /[sS]hip/ {
        $3 = "IP address"
        print
    }' file

!~마지막 테스트에서의 사용을 기록해 두십시오.

이것은 모두 입력 iffile이 다음과 같다고 가정합니다.간단한 CSV즉, 필드에 쉼표나 줄 바꿈이 포함되어 있지 않습니다(CSV 파일에서 올바르게 인용된 필드에서는 허용됨).

답변2

밀러이런 일에 좋습니다:

$ mlr --csvlite \
    filter '$field_name =~ "[Ii]p" && $field_name =~ "[Aa]ddress" && $field_name !=~ "[Ss]hip"' \
    then put -S '$field_friendly_name = "IP address"' raw.csv
_id,field_name,field_friendly_name,purpose_of_use,category
1,customer_ip_address_nbr,IP address,Ab,cd
2,customer_ipaddress,IP address,Ab,cd
3,customer_ipaddress,IP address,Ab,cd
6,Ipaddress,IP address,Ab,cd

답변3

$ awk '
    BEGIN { FS=OFS="," }
    NR == 1 { print; next }
    { k = tolower($2) }
    (k ~ /ip/) && (k ~ /address/) && (k !~ /ship/) {
        $3 = "IP address"
        print
    }
' file
_id,field_name,field_friendly_name,purpose_of_use,category
1,customer_ip_address_nbr,IP address,Ab,cd
2,customer_ipaddress,IP address,Ab,cd
3,customer_ipaddress,IP address,Ab,cd
6,Ipaddress,IP address,Ab,cd

답변4

Python으로 완료

#!/usr/bin/python
import re
j=re.compile(r'ip',re.IGNORECASE)
o=re.compile(r'address',re.IGNORECASE)
z=re.compile(r'ship',re.IGNORECASE)
k=open('p.txt','r')
q=k.readline()
print q.strip()
for i in k:
    if re.search (j,i) and (o,i):
        if not re.search(z,i):
            print i.strip()

산출

_id,field_name,field_friendly_name,purpose_of_use,category
1,customer_ip_address_nbr,,Ab,cd
2,customer_ipaddress,,Ab,cd
3,customer_ipaddress,,Ab,cd
6,Ipaddress,,Ab,cd

관련 정보