awk를 사용하여 두 경우 모두 대괄호를 어떻게 바꿀 수 있습니까?
빈 괄호를 "None"이라는 단어로 변경하세요.
192.168.0.24,위,()
대괄호를 제거하면 host.domain.com만 남습니다.
192.168.0.25,위,(host.domain.com)
답변1
sed를 사용하세요:
echo -e "192.168.0.25,Up,()\n1.2.3.4,Up,(host.domain.com)" |
sed 's/()/None/g;s/[()]//g'
192.168.0.25,Up,None
1.2.3.4,Up,host.domain.com
이것은 awk 프로그램입니다:
BEGIN {FS=","}
$3 ~ /\(\)/ { printf ($1","$2",None\n"); next }
$3 ~ /\(.+\)/ {
gsub ("\\(", "")
gsub ("\\)", "")
}
{ printf ($0"\n") }
불러라
echo -e "1.8.0.5,Up,()\n1.2.3.4,Up,(host.d.com)" | awk -f ip.awk
예를 들어.
답변2
이것은 작동합니다 -
awk -F"," -v OFS="," '
$NF=="()" {print $1,$2,"NONE";next}
{gsub(/\(|\)/,"",$NF);print}' INPUT_FILE
설명하다:
필드 구분자를 로 설정
,
하고 출력 필드 구분자를 로 설정 했습니다,
. OFS를 설정하면 필수 필드 구분 기호를 명시적으로 인쇄하지 않아도 됩니다.스키마
$NF=="()"
(여기서 $NF는 마지막 필드)를 확인하고 true인 경우 첫 번째와 두 번째 필드를 인쇄하고NONE
마지막 필드를 인쇄합니다. 샘플 데이터에는 3개의 필드만 있으므로 이 접근 방식은 괜찮습니다. 그러나 필드가 5개보다 많으면 간단한 필드를 사용하는 것이for loop
이상적입니다.for loop
이렇게 작동하는지 확인하세요i=1;i<NF;i++
. 최종 필드를 수동으로 배치할 수 있습니다. 또한next
두 번째 작업이 첫 번째 행에서 실행되는 것을 원하지 않기 때문에 다음 행으로 이동이라는 키워드를 사용합니다.두 번째 작업 문은 첫 번째 작업 문과 일치하지 않는 모든 행에 대해 true입니다. 여기서는 아무것도 대체하지 않기 위해 전역 대체 내장 함수를 사용합니다
brackets
.
시험:
[jaypal:~/Temp] cat file
192.168.0.24,Up,()
192.168.0.25,Up,(host.domain.com)
192.168.0.24,Up,()
192.168.0.24,Up,()
192.168.0.25,Up,(host.domain.com)
192.168.0.25,Up,(host.domain.com)
[jaypal:~/Temp] awk -F"," -v OFS="," '
$NF=="()" {print $1,$2,"NONE";next}
{gsub(/\(|\)/,"",$NF);print}' file
192.168.0.24,Up,NONE
192.168.0.25,Up,host.domain.com
192.168.0.24,Up,NONE
192.168.0.24,Up,NONE
192.168.0.25,Up,host.domain.com
192.168.0.25,Up,host.domain.com