URL이 포함된 CSV 파일을 처리하여 잘못된 "기본" 포트를 명시적으로 지정된 포트로 교체합니다.

URL이 포함된 CSV 파일을 처리하여 잘못된 "기본" 포트를 명시적으로 지정된 포트로 교체합니다.

CSV 파일에 URL/포트 설명이 있는데 그 중 일부가 잘못된 "기본" 값입니다.

입력 데이터 예시

http://example.com, 80
https://lookup/bin/search, 443
testecho345.unix.abc1200.org:8115,80
century.testing.external-abc03:6112,80
century.testing.external-abc03:6112,80
https://century.testing.internal-abc03:6112,443
testecho345.unix.abc1200.org:8115,80
testecho345.unix.abc1200.org:8117,80
  • 포트 번호가 URL에 명시적으로 지정된 경우 열 2의 '기본 포트' 80을 나중에 .txt 파일에 명시된 실제 포트로 재정의하고 싶습니다 :.
  • 행이 http://다음으로 시작하면 포트는 80이어야 하고, 그렇다면 https://포트는 443이어야 합니다. 그러나 포트가 명시적으로 지정되면 포트가 2열에 인쇄되기를 원합니다.
  • 또한 중복된 행을 제거하고 싶습니다.

원하는 출력

http://example.com, 80
https://lookup/bin/search, 443
testecho345.unix.abc1200.org,8115
century.testing.external-abc03,6112
https://century.testing.internal-abc03,6112
testecho345.unix.abc1200.org,8117

아래 스크립트를 사용해 보았지만 예상한 결과를 얻지 못했습니다.

    grep -P  '((?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)|(http|ftp|https|ftps|sftp)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/+#-]*[\w@?^=%&/+#-])?|\.port|\.host|contact-points|\.uri|\.endpoint)' 4file|sed 's/com.*/com/'|sed 's/org.*/org/'|grep '^[^#]'|sed '/.com\|.org\|10.\|17./!d'|awk '{split($0,a,"#"); print a[1]}'|awk '{split($0,a,"="); print a[1],a[2]}'|awk '{split($0,a,":"); print a[1],a[2]}'|sed -E 's/^([^:]*):([^,]*),.*$/\1,\2/'|sed 's/^\|#/,/g'|awk '/http:\/\//  {print $2,80}
       /https:\/\// {print $2,443}
       /Points/     {print $2,"9042"}
       /host/       {h=$2}
       /port/       {print h,$2; h=""}'|awk -F'[, ]' '{for(i=1;i<NF;i++){print $i,$NF}}'|awk 'BEGIN{OFS=","} {$1=$1} 1'|sed '/^[0-9]*$/d'|awk -F, '$1 != $2'|sed -E 's_^https?://__'
done |awk '!a[$0]++

당신의 도움에 미리 감사드립니다.

답변1

다음 사항이 적용되어야 합니다 awk.

awk -F',' -v OFS=',' '/^http:/ {$2=80} /^https:/ {$2=443} \
$1~/:[0-9]+$/ {n=split($1,f,":"); $2=f[n]; sub(/:[0-9]+$/,"",$1);} !already[$0]++' input.txt

이는 파일을 쉼표로 구분된 입력( -F',')과 출력( -v OFS=',')으로 해석합니다.

  • 행이 로 시작하면 http:두 번째 열은 80으로 설정됩니다.
  • 행이 로 시작하면 https:두 번째 열은 443으로 설정됩니다.
  • 모든 행(이전 규칙에 의해 이미 처리된 행 포함)에서 첫 번째 필드가 :숫자 이상으로 끝나는 경우 마지막 부분을 추출하여 두 번째 열의 내용으로 설정하고 삭제에서 변경합니다. 하나의 열.
  • 각 행의 발생 횟수는 배열에 기록됩니다 already. 현재 행이 0인 경우에만 행의 내용이 인쇄됩니다. 이는 속기 표기법을 사용합니다. 즉, 규칙 외부에 나타나는 awk(또는 실제로는 0보다 큰 숫자)은 "지금까지 수행된 모든 변환을 포함하여 줄을 인쇄합니다"를 의미하고, "해당 줄을 인쇄하지 않음"을 의미하며 후위 연산자는 증가합니다. 발생 횟수10++뒤쪽에논리적 "NOT"으로 평가됩니다.

GNU 및 awk.mawknawk

파이프 구조로 그룹화하는 것은 거의 필요하지 않으며 awk일반적 sed으로 grep세 사람 중 한 명이 전체 작업을 스스로 완료할 수 있습니다.

관련 정보