2016-07-27 3 views
2

У меня есть несколько сценариев оболочки, которая работает с трубами, как например:чтения STDIN на куски в Баш трубе

foo.sh | bar.sh 

Мои bar.sh вызывает некоторую командную программу строки, которая может принимать только определенное количество строк стандартного ввода. Таким образом, я хочу, чтобы большой stdout foo.sh был разбит на N количество строк, чтобы сделать несколько звонков bar.sh. По существу, paginate foo.sh 's stdout и делать несколько bar.sh.

Возможно ли это? Я надеюсь на магию между трубами, как foo.sh | ??? | bar.sh. xargs -n не совсем понял, чего я хочу.

+0

'программа, которая может принимать только определенное количество строк stdin' Что вы хотите сделать с оставшимся' stdin' в трубе? отказаться от него? Если да, вы можете использовать команду ['head'] (http://www.unix.com/man-page/linux/1/head/). – anishsane

+2

@anishsane Он хочет называть 'bar.sh' несколько раз партиями строк. – Barmar

ответ

2

Я нигде рядом с машиной, чтобы проверить это, но вам нужно GNU Parallel сделать это легко - вдоль линий:

foo.sh | parallel --pipe -N 10000 -k bar.sh 

В качестве дополнительного бонуса, который будет работать как можно больше bar.sh, так как у вас есть ядра ЦП.

Добавить -j 1, если вы хотите только один bar.sh за один раз.

Добавить --dry-run если вы хотите посмотреть, что он будет делать, но без doinng ничего.

1

Используйте петлю while read.

foo.sh | while read line1 && read line2 && read line3; do 
    printf "%s\n%s\n%s\n" "$line1" "$line2" "$line3" | bar.sh 
done 

Для больших N, напишите функцию, которая петли.

read_n_lines() { 
    read -r line || return 1 
    echo "$line" 
    n=$(($1 - 1)) 
    while [[ $n -gt 0 ]] && read -r line; do 
     echo "$line" 
     n=$((n-1)) 
    done 
} 

Тогда вы можете сделать:

n=20 
foo.sh | while lines=$(read_n_lines $n); do 
    printf "%s\n" "$lines" | bar.sh 
done 
+0

Это близко, но мой N является большим числом, и, хотя вполне возможно написать условие «while» с предикатами N, я бы предпочел. Можно ли не писать N предикатов? –

+0

@StephenChu Я добавил функцию, которая читает и повторяет по N строк за раз. – Barmar

Смежные вопросы