我在 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
这将无条件地打印文件的第一行。
然后它测试一些模式,确保允许初始字符的大小写变化。测试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