![ファイル内の発生別番号[閉じる]](https://linux33.com/image/112730/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%86%85%E3%81%AE%E7%99%BA%E7%94%9F%E5%88%A5%E7%95%AA%E5%8F%B7%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
以下にファイルがあります。 2番目と4番目の結合フィールドの発生回数に応じて、最初のフィールドの番号を再割り当てする必要があります。 3番目と5番目のフィールドは関係ありません。アイデア?入力ファイルは次の順序でソートされます。
sort -t',' -k2,2n -k4,4 -k5,5rn
入力する:
1,01053,11315,ABC,-38,Sin
1,01053,11315,ABC,-88,Sin
1,01053,11315,CDE,-114,Sin
1,2003700,11314,ABC,-1,Sin
1,2003700,11314,CDE,-44,unit
1,2003700,11314,CDE,-72,unit
1,2003700,11314,CDE,-694,Sin
私が望む出力:
1,01053,11315,ABC,-38,Sin
2,01053,11315,ABC,-88,Sin
1,01053,11315,CDE,-114,Sin
1,2003700,11314,ABC,-1,Sin
1,2003700,11314,CDE,-44,unit
2,2003700,11314,CDE,-72,unit
3,2003700,11314,CDE,-694,Sin
答え1
ファイルは2番目と4番目のフィールドに基づいてソートされているため、順番に番号付きの行を連続する必要があります。したがって、ファイルは1行ずつ処理されます。行が前の行と同じ順序にある場合は順序番号を増やし、そうでない場合は順序番号を1にリセットします。
awk -F, '{
if ($2 FS $4 == previous) i++; else i=1;
sub(/^[^,]*/, i);
print;
previous = $2 FS $4;
}'