Здесь вам нужно определить начинается .
Вы можете вставить последовательности символов, отправленные вашим терминалом, когда вы нажимаете 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"
Если 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}'
Edit:
zcat vcf.gz | grep -o -P './.' | uniq
или если вы хотите по порядку:
zcat vcf.gz | grep -o -P './.' | sort -u
Предположим, что строки, начинающиеся с буквы, являются комментариями или игнорируются.
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[]
(в неуказанном порядке) и просто печатает ключи.
Если вы хотите сохранить порядок в данных или использовать какой-то определенный порядок для ключей, то приведенный выше фрагмент нуждается в небольших изменениях.
С помощью awk
проверяем, что 4-й столбец имеет правильный формат:
awk 'match($4, /^[0-9]+\/[0-9]+:/) {
c = substr($4, RSTART, RLENGTH-1)
if (!seen[c]++) print c
}'