完璧なような質問がありますが、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である最初の「フィールド」のみを印刷します。