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

Здесь вам нужно определить начинается .

Вы можете вставить последовательности символов, отправленные вашим терминалом, когда вы нажимаете F3 во входной буфер терминального устройства перед запуском вашей программы с помощью TIOCSTI ioctl () в некоторых системах, например Linux:

{
   perl -le 'require "sys/ioctl.ph";
   ioctl(STDIN, &TIOCSTI, $_) for split "","@ARGV"' "$(tput kf3)"
   program
}

Или вы можете использовать что-то вроде expect для запуска вашей программы на поддельном уровне терминала, дождитесь вывода какого-либо запроса (или любого указания, что он запущен вверх до точки, которую вы ожидаете), и отправьте этот вывод затем:

expect -c 'spawn -noecho program; expect {>} {send [exec tput kf3]}; interact'

(здесь ожидается приглашение > , замените некоторой строкой, которую программа выводит, когда она готова к чтению ввода ).

Вы также можете заменить его стандартный ввод на канал, но если это приложение ожидает нажатия клавиш вроде F3 , это, скорее всего, интерактивное приложение, поэтому ему, вероятно, не понравится, если стандартный ввод не является терминалом. В любом случае вы всегда можете попробовать:

tput kf3 | program

Однако, после того, как программа прочитает вывод tput , она увидит конец файла (больше нечего читать ), что может привести к его выходу. С помощью:

{ tput kf3; cat; } | program

Мы отправляем вывод kf3 , а затем используем cat для пересылки всего, что вы вводите на терминале, в программу . Опять же, это вряд ли сработает, поскольку, скорее всего, программа переведет терминал в режим, в котором ввод отправляется, как только вы вводите и отключаете эхо , что он больше не может делать. поскольку его вход не является терминалом.

Вы могли бы сделать ту же настройку самостоятельно:

saved_settings=$(stty -g)
stty -icanon -echo min 1 time 0
{ tput kf3; cat; } | program
stty "$saved_settings"
1
24.11.2016, 16:25
5 ответов

Если 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+):|

0
27.01.2020, 23:25

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

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)
0
27.01.2020, 23:25

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

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

В вашем случае:

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

Edit:

zcat vcf.gz | grep -o -P './.' | uniq

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

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

0
27.01.2020, 23:25

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

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[] (в неуказанном порядке) и просто печатает ключи.

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

0
27.01.2020, 23:25

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

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

Теги

Похожие вопросы