列 1 の固有値発生増分数を印刷する方法

列 1 の固有値発生増分数を印刷する方法

この問題を解決しようとしていますが、数を増やしてからタブ区切りのテキストファイルの列1にある固有値の数を印刷する必要があります。例は次のとおりです。

Apple_1   1      300
Apple_2   1      500
Apple_2   500    1500
Apple_2   1500   2450
Apple_3   1      1250
Apple_3   1250   2000

希望の出力は次のとおりです。

Apple_1   1      300     1
Apple_2   1      500     1
Apple_2   500    1500    2
Apple_2   1500   2450    3
Apple_3   1      1250    1
Apple_3   1250   2000    2

NRを印刷してawkから行番号を印刷できることを知っていますが、列1の各固有値に対してそれらをリセットする方法がわかりません。

あなたが提供できる助けに感謝します。

答え1

この種の問題を解決するためのAwkの標準的なトリックは、関連付けカウンタ配列を使用することです。

awk '{ print $0 "\t" ++count[$1] }'

各行の最初の単語が表示される回数を計算します。これはまさにあなたが要求したものではありません。なぜなら

Apple_1   1      300
Apple_2   1      500
Apple_1   500    1500

生産します

Apple_1   1      300     1
Apple_2   1      500     1
Apple_1   500    1500    2

(ご覧のように、の数はApple_1リセットされませんApple_2。)しかし、入力がソートされていれば大丈夫です。

それ以外の場合は、カウンターと最後に見たキーを追跡する必要があります。

awk '{ if (word == $1) { counter++ } else { counter = 1; word = $1 }; print $0 "\t" counter }'

答え2

この回答はあなたが指定した正確な結果を提供しません。ただし、他のユーザーがより興味を持っている可能性があります。


必要でない場合増加数を計算しますが、各固有値の数だけを計算すると、より単純なものを使用できます。

cut -f1 file.txt | sort | uniq -c

(これはcutスペースだけでなくタブ区切り文字によっても異なります。)


実際、ファイルはすでに最初のフィールドにソートされているため、ソートする必要はありません。

cut -f1 file.txt | uniq -c

元のファイルの新しい4番目の列として含めるには、次のものを使用できますjoin

cut -f1 file.txt | uniq -c | join -2 2 file.txt -

joinソートされた入力によって異なります)

提供される入力の出力は次のとおりです。

Apple_1 1 300 1
Apple_2 1 500 3
Apple_2 500 1500 3
Apple_2 1500 2450 3
Apple_3 1 1250 2
Apple_3 1250 2000 2

joinスペース区切り文字(タブかスペースでも)は直観的に読み取られますが、区切り文字の1つだけが空白になります。タブを復元するには、次のようにパイプします。tr ' ' '\t'

関連情報