awk를 사용하여 대괄호를 교체하시겠습니까?

awk를 사용하여 대괄호를 교체하시겠습니까?

awk를 사용하여 두 경우 모두 대괄호를 어떻게 바꿀 수 있습니까?

  1. 빈 괄호를 "None"이라는 단어로 변경하세요.

    192.168.0.24,위,()

  2. 대괄호를 제거하면 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

설명하다:

  1. 필드 구분자를 로 설정 ,하고 출력 필드 구분자를 로 설정 했습니다 ,. OFS를 설정하면 필수 필드 구분 기호를 명시적으로 인쇄하지 않아도 됩니다.

  2. 스키마 $NF=="()"(여기서 $NF는 마지막 필드)를 확인하고 true인 경우 첫 번째와 두 번째 필드를 인쇄하고 NONE마지막 필드를 인쇄합니다. 샘플 데이터에는 3개의 필드만 있으므로 이 접근 방식은 괜찮습니다. 그러나 필드가 5개보다 많으면 간단한 필드를 사용하는 것이 for loop이상적입니다. for loop이렇게 작동하는지 확인하세요 i=1;i<NF;i++. 최종 필드를 수동으로 배치할 수 있습니다. 또한 next두 번째 작업이 첫 번째 행에서 실행되는 것을 원하지 않기 때문에 다음 행으로 이동이라는 키워드를 사용합니다.

  3. 두 번째 작업 문은 첫 번째 작업 문과 일치하지 않는 모든 행에 대해 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

관련 정보