「*」で終わる行数の計算

「*」で終わる行数の計算

私のディレクトリには、次の内容を含むいくつかのファイルがあります。

Wood *
Nails
Large Hammer *

いくつかの名前は後ろにアスタリスクがあり、一部はそうではありません。この種類のコンテンツを含む複数のファイルがあります。各ファイルには製品がある場合とない場合があります。一つ隣には星があります。すべてのファイルで各製品のアスタリスクが発生した回数を数えるbashスクリプトを作成する必要があります。たとえば、出力は次のようになります。

Wood 12
Yellow Lamps 6
Nails 4
...

これは、すべてのファイルで木の横に星12個、ランプの横に星6個などが見つかったことを意味します。

Cで解析するのは非常に簡単ですが、バイナリを実行したくありません。私はシェルスクリプトが欲しいが、grepとawkに精通していませんが、これが必要だと確信しています。

星自体を数える方法は知っていますが、どの星がどの製品に属しているかをどのように追跡するのかわかりません。

ベストアンサー1

このように:

awk '$NF=="*"{$NF=""; arr[$0]++}END{for (i in arr) print i arr[i]}' ./*
  • $NFデフォルトはスペースで区切られた最新の文字列です。
  • 主な秘訣は、arr現在単語がある場所にayという関連単語を作成することです。そして増加
  • ああ、私たちENDは各キー/値を繰り返します。arrprint

そして1本のライン:

perl -anE '
    if ($F[-1] eq "*") {
        $k = join " ", @F[0..@F-2];
        $a->{$k}++
    }
    END{say "$_ $a->{$_}" for keys %$a}
' ./*

-aはい分ける@F基本配列のパターン

おすすめ記事