多くのURLシリーズの長いリストから、同じドメインを持つシリーズの最後のURLを除くすべてのエントリを削除します。

多くのURLシリーズの長いリストから、同じドメインを持つシリーズの最後のURLを除くすべてのエントリを削除します。

完璧なような質問がありますが、sed適切に使用する方法を理解するのに十分な知識がありません。

これは私が持っているものです - これに似ていますが、より長いファイルです:

https://www.npmjs.com
https://www.npmjs.com/package/rabin
https://www.politico.com/news/magazine/blah/blah
https://www.raspberrypi.org
https://www.raspberrypi.org/documentation/blah
https://www.raspberrypi.org/products/raspberry-pi-zero-w/
https://www.reddit.com
https://www.reddit.com/
https://www.reddit.com/r/geology/blah/blah/blah
https://www.reddit.com/r/commandline/blah/blah/blah
...thousands more...

必要なのは太字の項目だけです。つまり、ドメイン名を共有する一連のURLがあり、フルテキストファイルを表すには、各シリーズの最後のURLが必要です。

だから、前に矢印がある人だけ

https://www.npmjs.com
->https://www.npmjs.com/package/rabin
->https://www.politico.com/news/magazine/blah/blah
https://www.raspberrypi.org
https://www.raspberrypi.org/documentation/blah
->https://www.raspberrypi.org/products/raspberry-pi-zero-w/
https://www.reddit.com
https://www.reddit.com/
https://www.reddit.com/r/geology/blah/blah/blah
->https://www.reddit.com/r/commandline/blah/blah/blah
...thousands more...

どんなアイデアがありますか?

ありがとうございます!

ベストアンサー1

これを行うことができます:

cat input.txt | \
gawk -e '{match($0, /(https?:\/\/(?:www.)?[a-zA-Z0-9-]+?[a-z0-9.]+)/, url)} \
!a[url[1]]++{ \
    b[++count]=url[1] \
} \
{ \
    c[url[1]]=$0 \
} \
END{ \
    for(i=1;i<=count;i++){ \
        print c[b[i]] \
    } \
}' > output.txt

正規表現はおそらく簡単になり、ドメイン名のより多くのバリエーションを捉えることができますが、私の場合はうまくいきます。このawkコマンドは以下で修正されました。これ答え。 (興味深いことに、誰かが私の質問から「bash」タグを削除しましたが、私に本当に役に立った答えには「bash」タグが付いていました...

これについてさらに考えると、一致するドメインを最後に別の「フィールド」として追加するために質問を使用し、一意のソートを使用して最後のドメインを選択し、最後にドメイン「フィールド」を削除するか、むしろ次を使用することもできますあると思います。 Askは、ソート後に一意の元のURLである最初の「フィールド」のみを印刷します。

おすすめ記事