「10.1.1.1-10.1.1.3」形式を「10.1.1.1-3」に変換

「10.1.1.1-10.1.1.3」形式を「10.1.1.1-3」に変換

おそらく、私はこれが可能であることを知っていますが、awk今は解決策を思い出していません。

IP形式を変換する方法

10.1.1.1-10.1.1.3
10.100.100.11-10.100.100.31

到着

10.1.1.1-3
10.100.100.11-31

ここに私の試みがありますが、cut実際に期待どおりに動作しません。

wolf@linux:~$ echo 10.1.1.1-10.1.1.3 | cut -d . -f 1,2,3,4
10.1.1.1-10
wolf@linux:~$ 

wolf@linux:~$ echo 10.100.100.11-10.100.100.31 | cut -d . -f 1,2,3,4
10.100.100.11-10
wolf@linux:~$ 

答え1

以下は、共通のコンポーネント数に合わせて調整されたAWKを使用する一般的なソリューションです。

BEGIN {
    FS = "-"
}

NF == 2 {
    split($1, start, /\./)
    split($2, end, /\./)
    printf $1
    for (i = 1; i <= length(start); i++) {
        if (start[i] != end[i]) {
            for (j = i; j <= length(end); j++)
                printf "%s%s", (j > i ? "." : "-"), end[j]
            print ""
            next
        }
    }
    print ""
}

これも同様の状況を処理して1.2.3.4-1.2.5.6正しい範囲を印刷します。

1.2.3.4-5.6

答え2

ここにsed方法があります。-行から最後の行まですべての項目を検索してとして保存\1し、最後に表示されるa.と1つ以上の数字をとして保存します\2。その後、行全体が次に置き換えられます\1\2

$ sed -E 's/(.*-).*\.([0-9]+)/\1\2/' file 
10.1.1.1-3
10.100.100.11-31

またはawk、入力フィールド区切り記号を or に設定し、.出力-フィールド区切り記号を に設定し、最初のフィールド.を 4 番目のフィールド (a-と最後のフィールド) に印刷することもできます。

$ awk -F'[-.]' -vOFS="." '{print $1,$2,$3,$4"-"$NF}' file 
10.1.1.1-3
10.100.100.11-31

答え3

1つのオプションawk

awk -F'[.-]' '{ print $1"."$2"."$3"."$4"-"$8 }'

出力:

10.1.1.1-3
10.100.100.11-31

答え4

$ sed 's/-.*\./-/' file
10.1.1.1-3
10.100.100.11-31

関連情報