ファイルからプレーンテキスト行をコピーし、中間線プレフィックスを使用して同じファイルに追加するか、中間線プレフィックスを削除します。

ファイルからプレーンテキスト行をコピーし、中間線プレフィックスを使用して同じファイルに追加するか、中間線プレフィックスを削除します。

複数のホストファイルを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.

関連情報