次の形式のドメイン名ファイルがあります。
www.mozilla.org
www.mozilla.org
www.mozilla.org
www.mozilla.org
www.google.com
www.google.com
www.rust-lang.org
www.google.com
www.google.com
www.google.com
www.google.com
たとえば、ランタイムが4より長い場合は、同じ行の実行を縮小したいと思います。これにより、次の出力データが提供されます。
www.mozilla.org
www.google.com
www.google.com
www.rust-lang.org
www.google.com
私はBashでこれを行うことを望んでいます。
inp = """www.mozilla.org
www.mozilla.org
www.mozilla.org
www.mozilla.org
www.google.com
www.google.com
www.rust-lang.org
www.google.com
www.google.com
www.google.com
www.google.com"""
def collapse(n, inp):
prev = ""
output = []
cnt = 0
for line in inp.split('\n'):
if line == prev:
cnt += 1
if line != prev:
if cnt >= n-1:
output = output[:-cnt]
cnt = 0
prev = line
output.append(line)
#last set of lines is an edgecase
if cnt > n-2:
output = output[:-cnt]
print('\n'.join(output))
collapse(4, inp)
答え1
uniq -c
実行長を計算し、awk
その回数に応じて適切な回数だけデータを出力するために使用されます。
$ uniq -c file | awk '$1 >= 4 { $1 = 1 } { for (i = 1; i <= $1; ++i) print $2 }'
www.mozilla.org
www.google.com
www.google.com
www.rust-lang.org
www.google.com
このuniq -c
コマンドはサンプルデータを使用して次の行を出力します。
4 www.mozilla.org
2 www.google.com
1 www.rust-lang.org
4 www.google.com
このawk
コマンドは最初の列の数字に対して機能し、数字が4より小さい場合は2番目の列の値を出力し、それ以外の場合は1回出力します。