Можно ли передать stderr по конвейеру при сохранении stdout? [дубликат]

Решение с 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 .

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

2
04.10.2016, 18:55
1 ответ
{ cmd 2>&1 >&3 3>&- | logger 3>&-; } 3>&1

Идея состоит в том, что outer stdout дублируется на файловый дескриптор (fd) 3 и восстанавливается для cmd на stdout, в то время как сам файловый дескриптор cmd (stderr) идет в канал для логгера.

3>&- заключается в том, чтобы закрыть этот fd для команд cmd и logger после того, как он выполнил свою цель, поскольку эти команды не будут нуждаться в нем/ использовать его.

2
27.01.2020, 22:10

Теги

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