Bash: как выполнить арифметику на числах в канале

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

например,

> echo "1 2 3 4 5" | some command | cat 
1 4 9 16 25
>

У Вас были бы какие-либо идеи о том, как заставить что-то вроде этого работать? Фактическая операция, которую я хочу выполнить, просто добавляет тот к каждому числу.

7
задан brice 17 July 2010 в 16:01
поделиться

6 ответов

echo 1 2 3 4 5|{
  read line; 
  for i in $line;
  do
    echo -n "$((i * i)) "; 
  done; 
  echo
}

{} создает группировку. Вместо этого вы можете создать сценарий для этого.

7
ответ дан 6 December 2019 в 09:18
поделиться

Или вы можете передать выражение по конвейеру в bc:

echo "1 2 3 4 5" | (
  read line; 
  for i in $line;
  do
    echo $i^2 | bc; 
  done; 
  echo
)
1
ответ дан 6 December 2019 в 09:18
поделиться

Я бы написал:

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
4
ответ дан 6 December 2019 в 09:18
поделиться

Или ..

echo "1 2 3 4 5" | xargs -n 1 | while read number 
 do
   echo $((number * number))
 done
3
ответ дан 6 December 2019 в 09:18
поделиться
echo 1 2 3 4 5 | xargs -n 1 bash -c 'echo $(($1*$1))' args 
1
ответ дан 6 December 2019 в 09:18
поделиться

Если вы предпочитаете Python:

#!/bin/python
num = input()
while num:
    print(int(num) + 1) # Whatever manipulation you want
    try:
        num = input()
    except EOFError:
        break
0
ответ дан 6 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

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