Я получаю поток чисел в канале и хотел бы выполнить некоторые операции перед передачей их к следующему разделу, но я немного потерян о том, как я пошел бы об этом, не повреждая канал.
например,
> echo "1 2 3 4 5" | some command | cat
1 4 9 16 25
>
У Вас были бы какие-либо идеи о том, как заставить что-то вроде этого работать? Фактическая операция, которую я хочу выполнить, просто добавляет тот к каждому числу.
echo 1 2 3 4 5|{
read line;
for i in $line;
do
echo -n "$((i * i)) ";
done;
echo
}
{} создает группировку. Вместо этого вы можете создать сценарий для этого.
Или вы можете передать выражение по конвейеру в bc:
echo "1 2 3 4 5" | (
read line;
for i in $line;
do
echo $i^2 | bc;
done;
echo
)
Я бы написал:
echo "1 2 3 4 5" | {
for N in $(cat); do
echo $((N ** 2))
done | xargs
}
Мы можем думать об этом как о «карте» (функциональное программирование). Есть много способов написать функцию "map" в bash (используя stdin, function args, ...), например:
map_stdin() {
local FUNCTION=$1
while read LINE; do
$FUNCTION $LINE
done
}
square() { echo "$(($1 * $1))"; }
$ echo "1 2 3 4 5" | xargs -n1 | map_stdin square | xargs
1 4 9 16 25
Или ..
echo "1 2 3 4 5" | xargs -n 1 | while read number
do
echo $((number * number))
done
echo 1 2 3 4 5 | xargs -n 1 bash -c 'echo $(($1*$1))' args
Если вы предпочитаете Python:
#!/bin/python
num = input()
while num:
print(int(num) + 1) # Whatever manipulation you want
try:
num = input()
except EOFError:
break