Лучше чем `тройник | вырезать | … | paste`

У меня была такая же проблема, как и у вас. Настоящее сообщение об ошибке находится в вашем файле config.log. Выясните это и попытайтесь решить проблему. В моем случае я изменил другую версию gcc, чтобы решить проблему.

5
29.07.2016, 02:33
2 ответа

Это зависит от того, насколько сложным является вывод и насколько необходимо поддерживать форматирование (например, всегда ли первый столбец имеет длину 8 символов? и т.д.). Однако цикл while может сработать

cat source.tab | while read -r name id
do
  echo "$name $id $(dbstream .... code=$id)"
done

Вы можете изменить то, что происходит внутри цикла для форматирования, как вам нравится. например

cat source.tab | while read -r name id
do
  res=$(dbstream ... code=$id)
  printf "%10s %5d %s" $name $id $res
done

Согласно комментарию, вы хотите вызвать dbstream только один раз. Это требует, чтобы dbstream сохранял вывод в том же порядке, что и ввод.

Вот простой пример dbstream программы:

#!/bin/sh
for a in "$@"
do
  echo dbstream $$ sees $a
done

Мы включаем PID в вывод, чтобы показать, что он вызывается только один раз.

Теперь мы можем использовать paste и подстановку процесса:

$ paste source.tab <(./dbstream $(awk '{print $2}' source.tab ))
alice 1 dbstream 20671 sees 1
bob   2 dbstream 20671 sees 2

Теперь, если source.tab - медленный процесс, я бы рекомендовал использовать временный файл

например

#!/bin/bash

tmp=`mktemp`

trap '/bin/rm -f $tmp ; exit' 0 1 2 3 15

cat source.tab > $tmp
paste $tmp <(./dbstream $(awk '{print $2}' $tmp ))
8
27.01.2020, 20:36

Правильный способ, похоже, заключается в использовании именованной трубы

Пример:

function datastreamWrapper() {

  mypipe=$(mktemp -u)
  mkfifo -m 600 "$mypipe"

  tee >( cut -f2 | datastream ... > "$mypipe") | paste - "$mypipe"

  rm "$mypipe"
}

Тогда вы можете поместить datastreamWrapper в ваш трубопровод:

cat source.tab | datastreamWrapper | foo
0
27.01.2020, 20:36

Теги

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