需要特定列上的帮助模式匹配并更新使用 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”并包含“地址”)和(不包含“ship”)

我试过:

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

这将无条件地打印文件的第一行。

然后它测试一些模式,确保允许初始字符的大小写变化。测试Shipship已完成,因此它是真的如果图案匹配(与!)。

如果某行通过了所有测试,则更新其第三列并打印修改后的行。

如果我们要匹配的子串是在第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

相关内容