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:2番目の列は80に設定されます。
  • 行がで始まる場合、https:2番目の列は443に設定されます。
  • すべての行(以前の規則によってすでに処理されている行を含む)の最初のフィールドが:数字以上で終わっている場合は、最後の部分を抽出して2番目の列の内容に設定し、削除から変更します。 1列。
  • 各行の発生回数は配列に書き込まれますalready。現在の行がゼロの場合にのみ、行の内容が印刷されます。これは速記表記法を使用します。つまり、ルールの外に現れるawk(または実際にはゼロより大きい数字)は、「これまでに行われたすべての変換を含む行を印刷します」を意味し、「対応する行を印刷しない」を意味し、後続演算子は増加しますします。発生回数10++後ろに論理「NOT」と評価されます。

GNUとawkmawknawk

パイプ構造にグループ化することはawkほとんど必要ありません。sedgrep

おすすめ記事