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

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

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 

и я хотел бы подсчитать, сколько раз появляется один и тот же идентификатор. Что-то вроде:

  • Есть ли более элегантный способ подсчета слов и присвоение этому числу переменных?
  • GREP / SED или AWK: печать всего абзаца в файле по совпадению с образцом
  • Выделение ключевых слов с помощью стандартных утилит командной строки?
  • Является ли это документированным поведением для BSD Awk или ошибка?
  • Сценарий оболочки (bash) для добавления или замены текста лицензии, содержащегося в файлах .c, .h и makefiles?
  • Grep: поиск и замена полной строки
  •  Prom_1 3 Prom_2 4 Prom_3 2 

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

  • Как я могу напечатать нечетные и четные строки в виде столбца с помощью AWK?
  • Есть ли разница между read, head -1 и sed 1q?
  • Выставить awk над tcp (inetd, socat и т. Д.)
  • Регулярное изменение / оператор (foo | bar) в GNU или BSD Sed
  • Заменить \ n пустым в файле
  • Объединение столбцов в 2 файла и печать значений, которые различаются
  • 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 - лучшая ОС в мире.