この問題を解決しようとしていますが、数を増やしてからタブ区切りのテキストファイルの列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'