次のファイルがあります。
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_3
before)、次のようにProm_10
置き換えることができます(バージョン順)。sort
sort -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_を追加します。