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보다 큰 숫자)은 "지금까지 수행된 모든 변환을 포함하여 줄을 인쇄합니다"를 의미하고, "해당 줄을 인쇄하지 않음"을 의미하며 후위 연산자는 증가합니다. 발생 횟수1
0
++
뒤쪽에논리적 "NOT"으로 평가됩니다.
GNU 및 awk
.mawk
nawk
파이프 구조로 그룹화하는 것은 거의 필요하지 않으며 awk
일반적 sed
으로 grep
세 사람 중 한 명이 전체 작업을 스스로 완료할 수 있습니다.