nより長い行を1行に縮小し、その行の他のインスタンスはそのまま残します。

nより長い行を1行に縮小し、その行の他のインスタンスはそのまま残します。

次の形式のドメイン名ファイルがあります。

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回出力します。

おすすめ記事