Список всех уникальных строк в определенном столбце

Я не знаю, что у меня в моем огромном файле vcf.gz, который выглядит так

CHROM POS ALT 12345 1 345632 T 0/1:4,4:8:99:105,0,106 4 032184 C 1/1:46,9:55:99:99,0,1222 6 843290 A 0/1:67,20:87:99:336,0,1641 7 743290 C 0/1:37,20:57:99:336,0,2641 8 329283 T 0/2:99:21:253,0,290:11,10 9 789320 C 2/2:99:21:253,0,290:11,10 

И я хотел бы извлечь все уникальные значения в 4-й столбец перед «:». То есть в этом случае:

  • Считайте раз, что выражение истинно в awk.
  • awk, когда оба разделителя и кавычки используются для поля
  • Найти, если какая-либо строка файла является подмножеством данных в другом файле
  • объединить 2 строки на основе одинаковых значений столбца
  • Почему awk не делает сумму ноль, а вместо этого очень маленьким?
  • Как печатать только последний столбец?
  •  0/1 1/1 0/2 2/2 

    Есть ли у вас какие-либо предложения?

  • разрезать с помощью 2-символьного разделителя
  • сценарий оболочки для извлечения символов
  • Заменить столбец в одном файле столбцом из другого с помощью awk?
  • Объединение 2-х файлов записей по шаблону
  • Разделить файл на основе шаблона с ведущими нулями
  • Комментируйте разделы текста, соответствующие определенным идентификаторам, перечисленным в другом файле
  • 5 Solutions collect form web for “Список всех уникальных строк в определенном столбце”

    С awk , проверяя, что 4-й столбец находится в правильном формате:

     awk 'match($4, /^[0-9]+\/[0-9]+:/) { c = substr($4, RSTART, RLENGTH-1) if (!seen[c]++) print c }' 

    Предположим, что строки, начинающиеся с буквы, являются комментариями или игнорируются.

     zcat vcf.gz | awk \ 'BEGIN { RS = "[\t\v\f ]*(\r\n|\n\r|\r|\n)" ; FS = "[\t\v\f ]+" } /^[A-Za-z]/ { next } NF >= 4 { key = $4 ; sub(/:.*$/, "", key) ; seen[key]++ } END { for (key in seen) printf "%s\n", key }' 

    Вы можете написать всю команду в одной строке (удалите \ в конце первой строки, хотя), потому что я добавил все необходимые точки с запятой, чтобы сделать это.

    Правило BEGIN устанавливает универсальную поддержку новой строки. Все пробелы в конце строк игнорируются, и любая форма новой строки (CR, LF, CRLF, LFCR) принимается как новая строка. Любое количество вкладок или пробелов рассматривается как разделители полей.

    Правило /^[A-Za-z]/ применяется ко всем строкам, начинающимся с буквы. next заставляет их игнорировать.

    Следующее правило применяется ко всем записям (строкам) с по меньшей мере четырьмя полями. Четвертое поле копируется в переменный key , затем все после первого двоеточия (включая двоеточие) удаляется. Мы используем полученное значение как ключ к seen ассоциативному массиву. Значение, которое мы присваиваем, на самом деле не имеет значения, но здесь seen[key] будет содержать количество раз, на которое ссылалось каждое значение (1 или более).

    Правило END запускается после обработки всех входных данных. Здесь цикл повторяется по клавишам seen[] массива (в неуказанном порядке) и просто печатает ключи.

    Если вы хотите сохранить порядок в данных или использовать определенный порядок для ключей, приведенный выше фрагмент нуждается в небольших модификациях.

    Если perl в порядке:

     $ perl -lane '($k) = $F[3] =~ m/^([^:]+)/; print $k if !$seen{$k}++ && $. > 1' ip.txt 0/1 1/1 0/2 2/2 
    • ($k) = $F[3] =~ m/^([^:]+)/ получить строку до : из 4-го столбца
    • Затем распечатайте, если он уникален, а не первая строка (чтобы избежать заголовка)

    Если шаблон перед : должен быть обязательно из digits/digits рисунка, затем измените соответствие на m|^(\d+/\d+):|

    Как однострочный

     gzip -dc input.gz | grep -E "^[0-9]" | cut -f 1 -d : | sort -k 4 -u | awk ' { print $4 } ' 

    Объяснение:

     * gzip -dc # decompress and write to standard output * grep -E "^[0-9]" # only look at lines starting with a digit * cut -f 1 -d: # remove the text following the colon * sort -k4 -u # sort on the forth field - uniquely * awk ' { print $4 } ' # print the fourth field (that we sorted on) 

    Я хотел бы использовать:

     grep -o -P '.{1}/.{1}' file 

    В твоем случае:

     zcat vcf.gz | grep -o -P '.{1}/.{1}' 

    Изменить: только для одного добавления добавьте uniq в конец строки:

    zcat vcf.gz | grep -o -P './.' | уник

    или если вы хотите его в порядке:

    zcat vcf.gz | grep -o -P './.' | sort -u

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