同じ識別子から正確な数の要素を抽出する

同じ識別子から正確な数の要素を抽出する

次のファイルがあります。

Id       Chr     Start   End    
Prom_1   chr1    3978952 3978953  
Prom_1   chr1    3979165 3979166  
Prom_1   chr1    3979192 3979193  
Prom_2   chr1    4379047 4379048  
Prom_2   chr1    4379091 4379092  
Prom_2   chr1    4379345 4379346  
Prom_2   chr1    4379621 4379622  
Prom_3   chr1    5184469 5184470  
Prom_3   chr1    5184495 5184496  

同じ識別子が何回表示されるかを計算したいと思います。それは次のとおりです。

Prom_1  3  
Prom_2  4  
Prom_3  2  

どんなアイデアにも感謝します。

答え1

そしてGNUデータの混合

$ datamash -W --header-in groupby 1 count 2 < file
Prom_1  3
Prom_2  4
Prom_3  2

答え2

以下を使用して識別子を計算できますuniq

tail -n +2 input | cut -d' ' -f1 | sort | uniq -c

ソートされたuniq入力が必要です。これを使用してtailヘッダーをスキップし、cut最初の列を「切り捨て」ます。

出力例:

  3 Prom_1
  4 Prom_2
  2 Prom_3

数字の小さいIDを数字の大きいIDの前に印刷する必要がある場合(例:Prom_3before)、次のようにProm_10置き換えることができます(バージョン順)。sortsort -V

tail -n +2 input2 | cut -d' ' -f1 | sort -V | uniq -c

出力例(input2にはidの追加行が含まれていますProm_10):

  3 Prom_1
  4 Prom_2
  2 Prom_3
  1 Prom_10

答え3

awkを使用できます。

awk 'NR>1 {a[$1]++} END { for (x in a) { print x,a[x] } } ' file

NR>1ヘッダー
a[$1]++はハッシュイテレータなので無視します。

答え4

user3589054に類似

IDが多いため、並べ替え時に同じ順序のIDを取得できません。たとえば、Prom_1 Prom_10などで始まるIDが最初に表示されるためです。だから私がしたことは次のとおりです。素晴らしい作品。

awk 'NR>1 {a[$1]++} END { for (x in a) { print x,a[x] } } ' file | awk -F "_" '{print $1"\t"$2"\t"}' | cut -f 2 | sort -n | awk -F " " '{print $1"\t"$2}' | sed 's/^/Prom_/' > file.output.txt

どこに:
awk 'NR>1 {a[$1]++} END { for (x in a) { print x,a[x] } } ' file |
IDと数字を含む出力を取得できますが、ソートされません。

awk -F "_" '{print $1"\t"$2"\t"}' | Prom、番号、ID番号、数量にファイルを分割します。

cut -f 2 | sort -n |
数値IDとその金額に基づいてソート

awk -F " " '{print $1"\t"$2}' |
ここでは2つの列を選択できます

sed 's/^/Prom_/'
最後に、番号Idの前にProm_を追加します。

関連情報