ソートがうまくいかないようです。

ソートがうまくいかないようです。

私は現在Webクローラーボットを作成しています。重複したエントリを削除し、行をアルファベット順に並べ替える必要があるURLのリストを生成します。私のコードは次のとおりです

#! /bin/bash
URL="google.com"
while [ 1 ]; do
  wget --output-document=dl.html $URL
  links=($(grep -Po '(?<=href=")[^"]*' dl.html))
  printf "%s\n" ${links[@]} >> results.db

  sort results.db | uniq -u

  URL=$(shuf -n 1 results.db)
  echo $URL
done

特にこの行は:

sort results.db | uniq -u

ベストアンサー1

POSIX説明するuniq -u

入力に重複した行を書き込むのを抑制します。

これは、冗長行(元の行を含む)がフィルタリングされることを意味します。おそらく(完了POSIX返品):

sort -u results.db

の場合、sort -uPOSIXは次のように言います。

固有:除外を除く一つ同じキーを持つ各行グループに。 -cオプションと一緒に使用すると、入力ファイルがソートされていることを確認するだけでなく、重複キーを含む行がないことを確認します。

どちらの場合も、次の行は

URL=$(shuf -n 1 results.db)

sort/uniq の目的は次のとおりです。修正する results.db(そうではありません)。これを行うには、スクリプトをさらに変更する必要があります。

sort -u results.db >results.db2 && mv results.db2 results.db

または(@drewbennが提案したように)前の行と組み合わせます。しかしそれ以来追加ファイルに(その答えに示されているコマンドを組み合わせても最新のprintfとファイルの内容との重複は削除されません)、別のコマンドsort / mvが元のスクリプトに近いように見えます。

nullでないことを確認するには$URL(実際には別の質問です)、testを使用してください[

  [ -n "$URL" ] && wget --output-document=dl.html $URL

単にループを終了する方が簡単ですが、

[ -z "$URL" ] && break

おすすめ記事