Извлечь точное количество элементов из одного и того же идентификатора

У меня есть файл, который выглядит так:

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 

Любая идея действительно ценится.

  • Как выводить сравнение значений в отдельных файлах
  • Замена значений сущности XML положительным обратным знаком
  • Как использовать sed, как заменить строку, содержащую шаблон, содержимым из другого файла?
  • Форматировать вывод на определенную длину строки
  • Как найти текст, скопировать его и вставить в следующую строку в файле?
  • Как заменить символ в sed, только если это происходит до буквы?
  • Извлечение пяти случайных элементов из списка с помощью sed
  • Отрегулируйте зазор между двумя столбцами, чтобы заставить их смотреть прямо
  • 5 Solutions collect form web for “Извлечь точное количество элементов из одного и того же идентификатора”

    Вы можете использовать awk

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

    NR>1 будет игнорировать заголовок
    a[$1]++ – хеш-итератор

    С GNU datamash

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

    Вы можете подсчитать идентификаторы с помощью uniq :

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

    Обратите внимание, что uniq ожидает отсортированный вход. Мы используем tail для пропуска заголовка и cut на «вырезание» первого столбца.

    Пример вывода:

      3 Prom_1 4 Prom_2 2 Prom_3 

    Если идентификатор с меньшим номером должен быть напечатан перед идентификатором большего числа (например, Prom_3 до Prom_10 ), вы можете заменить sort на sort -V (sort sort):

     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 

    Простой способ с cat, cut, sort и uniq:

     sed -n '1,$p' input | cut -d' ' -f1 | sort | uniq -c 

    Нечто похожее на user3589054:

    так как есть много Id, при сортировке у вас не будет одинакового порядка Id, потому что, например, Id, начинающийся с Prom_1 Prom_10 и т. д., будет таким же первым. Так что я сделал это, и он работал нормально:

    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 |
    вы будете иметь вывод с идентификатором и номером, но не отсортированы

    awk -F "_" '{print $1"\t"$2"\t"}' | вы разделите файл в Prom, номер, его идентификационный номер и его количество

    cut -f 2 | sort -n |
    сортировать по числу Id и его соответствующей сумме

    awk -F " " '{print $1"\t"$2}' |
    здесь вы вставляете два столбца

    sed 's/^/Prom_/'
    и, наконец, вы присоедините Prom_ перед его номером Id

    Linux и Unix - лучшая ОС в мире.