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

Я не знаю, что у меня в моем огромном файле 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-й столбец перед «:». То есть в этом случае:

 0/1 1/1 0/2 2/2 

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

  • вставить строку для отсутствующего значения
  • Как извлечь один файл из двух путей в unix?
  • Объединение / объединение 2 текстовых файлов в соответствии с числовым полем
  • Назначение переменной из файла, разделенной разделителем
  • Как grep несколько строк, которые начинаются с определенного значения
  • рассчитать числа на конец и слить в одну строку
  • Разбить большие файлы журналов
  • Чтобы добавить номера строк в каждой строке с помощью команды оболочки?
  • 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

    Interesting Posts

    Функциональность Mac Command + Up arrow в терминалах Linux?

    Печать и удаление первой строки файла с помощью `sed`

    Проблема с типом раздела Mac OS X

    Linux Mint Панель задач и значки исчезли

    Как конвертировать WavPack в FLAC?

    пустой экран после обновления ядра

    Vim Открыть файл в режимах с несколькими разделителями

    Как конвертировать Linux-систему с виртуальной машины на физическую машину без потери данных?

    Заменить требуемые утверждения автозагрузкой в ​​файле .emacs для повышения производительности

    SSH обратный переход к узлу «позади» узла SSH-сервера

    Остановить все индексы, если тест не прошел

    Imagemagick «конвертировать» текст в изображение: ReadTEXTImage: Assertion

    kswapd0 занимает от 99% до 100% процессора в RHEL 6.3

    Невозможно использовать -o allow_other с sshfs (опция включена в файле fuse.conf)

    Как я могу рассчитать среднее значение для каждой строки, исключая первое значение каждой строки?

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