結果

結果

次のような内容を含むファイルがあります:

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 から開始する必要があります。

上記のファイルに対して「while read color animal」を実行すると、色が以前の色と等しくなくなった場合、比較するにはどうすればよいでしょうか?

私は次のようなものを探しています:

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 つのことを追跡します。

  1. 最後に読んだ動物の名前a
  2. 最後に読んだ色c
  3. 「動物カウンター」ac
  4. 「カラーカウンター」cc

入力の 2 つの列で見つかった内容に応じてこれらの変数を更新します。

  • 色が最後に読んだ色と異なる場合は、色を増やしccて記憶するこれ代わりに色を使用します。また、リセットして を使用しacますa
  • 動物が最後に読んだものと異なる場合は、増加しacて記憶するこれ代わりに動物。

次に、入力の各行に対してccと を出力します。ac

各行の動物が一意であることが保証されている場合は、a変数を削除することができます。

答え2

perl -pale '$_ = join ".", reverse ++$h{$F[0]}, scalar keys %h'

ハッシュは任意の時点でのキーの数を保持%hkeyA => countscalar keys %h返します。次に、結果を逆にしてコンマで結合します。

結果

1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4

関連情報