複数のホストファイルを1つの大きなリストにコンパイルする醜いスクリプトを作成します。
www.
ほとんどのリストには、次の2つのURLエントリがあります。一つはあり、もう一つはありません。
127.0.0.1 facebook.com
127.0.0.1 www.facebook.com
しかし、私のリストのいくつかはそれほど倍増しませんが、そうなることを願っています。次のように散在しているURLがたくさんあります。
127.0.0.1 twitter.com
127.0.0.1 www.facebook.com
127.0.0.1 subdomain.facebook.com
127.0.0.1 tumblr.com
127.0.0.1 www.reddit.com
私が望むのは、ファイルにリストされているURLをスキャンして、www.
一致しないすべての行と一致しないwww.
すべての行を確認し、欠落している行をリストに追加したいと思います。私のリストは次のとおりです。www.
www.
127.0.0.1 twitter.com
127.0.0.1 www.twitter.com
127.0.0.1 facebook.com
127.0.0.1 subdomain.facebook.com
127.0.0.1 www.facebook.com
127.0.0.1 www.subdomain.facebook.com
127.0.0.1 tumblr.com
127.0.0.1 www.tumblr.com
127.0.0.1 reddit.com
127.0.0.1 www.reddit.com
sort -u
順番にする必要はありません。最後の手順でファイルを実行したときに、行の欠落をすべてファイルの末尾に追加するだけです。
答え1
スキャンをスキップしてペアの行を追加したら、出力を次にパイプすることができますsort -u
。
sed '/ www./{ # if line matches www.
h # copy it over the hold buffer
s// / # remove the www. part
G # append the original line to the modified one
}
//!{ # if line doesn't match www.
h # copy it over the hold buffer
s/ / www./ # add the www. part
G # append the original line to the modified one
}
' infile | sort -u
これは、2つの列(IPとURL)がスペースで区切られていると仮定します。必要に応じて正規表現を調整します。
または を使用してzsh
配列の行を読み込み、www.
存在する部分を削除し、結果を一意の要素配列に保存してから、各要素をそのまま1回、追加されたwww.
部分として1回、2回印刷できます。
mylist=(${(f)"$(<infile)"})
for i (${(u)mylist[@]/ www./ }) printf '%s\n' ${i} ${i/ / www.}
答え2
次のスクリプトを使用できますawk
。
script.awk:
{
gsub("www.", "", $2)
address[$2]
}
END{
for (item in address){
print("127.0.0.1", item)
print("127.0.0.1", "www." item)
}
}
呼ぶ
awk -f script.awk input
すべての項目の先頭から削除し、www.
配列を埋めます(値なし)。値が既に存在する場合は単に上書きされるため、重複を気にする必要はありません。最後に、配列の内容をそのまま一度、プレフィックスを使用して一度印刷しますwww.
。