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