次の内容を含むファイルがあります。
red dog
red cat
red bird
red horse
blue hamster
blue monkey
blue lion
pink pony
pink whale
pink pig
pink dolphin
各色のカウンターを増やした後、各動物のカウンターを増やす必要があります。したがって、赤は1、青は2、ピンクは3です。次に、犬、猫、鳥、馬は1、2、3、4になります。新しい色で始める必要があるため、ハムスターは1から再起動する必要があります。
そのファイルで「色の動物を同時に読み取る」を実行すると、色が以前の色と同じではなくなったときにどのように比較できますか?
私は次のようなものを探しています:
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4
どんな提案でも大いに感謝します:)
答え1
このようなawk
:
$ awk '$1 != c { cc++; c=$1; ac=0; a="" } $2 != a { ac++; a=$2 } { printf("%d.%d\n", cc, ac) }' file
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4
スクリプトawk
は次の4つを追跡します。
- 最近読んだ動物の名前、
a
。 - 最近読んだ色は
c
。 - 「動物カウンター」、
ac
。 - 「カラーカウンター」、
cc
。
両方の入力列の内容に基づいてこれらの変数を更新します。
- 最近読んだ色と色が異なる場合は、増やして
cc
覚えておいてください。これ代わりに色を指定します。またリセットしac
、a
。 - 動物が前回読んだものと異なる場合は、追加して
ac
覚えておいてくださいこれ代わりに動物。
次に、入力の各行の合計を印刷しますcc
。ac
各行の動物が一意であることを保証する場合は、このa
変数を削除できます。
答え2
perl -pale '$_ = join ".", reverse ++$h{$F[0]}, scalar keys %h'
ハッシュはいつでもキー数を%h
保存してkeyA => count
返します。scalar keys %h
その後、結果を反転してコンマで連結します。
結果
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4