Решение с awk
:
awk 'FNR==NR{c[$4]++;next;} c[$4]==3' file.dat file.dat
Вывод:
chr1 3000823 3000829 1
chr1 3001003 3001009 1
chr1 3001014 3001020 1
chr1 3007426 3007432 10
chr1 3007528 3007534 10
chr1 3007576 3007582 10
Пояснение:
FNR == NR
: Этот тест верен, когда количество записей равно количеству записей в файле. Это верно только для первого файла, для второго файла NR
будет равно количеству строк в файле1 + FNR. c [$ 4] ++
: увеличить индекс элемента массива на $ 4
. Я использую это как счетчик. next
: переход к следующей записи, ничего не делая. c [$ 4] == 3
: это происходит только с записями второго файла. Если этот тест прошел успешно, строка будет напечатана, поскольку печать является действием по умолчанию в awk
. Недостаток этого кода заключается в том, что он дважды читает файл, но, на мой взгляд, это чистый и простой для понимания способ выполнить эту работу.
{ cmd 2>&1 >&3 3>&- | logger 3>&-; } 3>&1
Идея состоит в том, что outer stdout дублируется на файловый дескриптор (fd) 3 и восстанавливается для cmd
на stdout, в то время как сам файловый дескриптор cmd (stderr) идет в канал для логгера.
3>&-
заключается в том, чтобы закрыть этот fd для команд cmd и logger после того, как он выполнил свою цель, поскольку эти команды не будут нуждаться в нем/ использовать его.