BASH: how to perform arithmetic on numbers in a pipe

前端 未结 10 1970
忘掉有多难
忘掉有多难 2021-01-18 08:12

I am getting a stream of numbers in a pipe, and would like to perform some operations before passing them on to the next section, but I\'m a little lost about how I would go

相关标签:
10条回答
  • 2021-01-18 08:18

    I'd write:

    echo "1 2 3 4 5" | {
      for N in $(cat); do
        echo $((N ** 2))
      done | xargs
    }
    

    We can think of it as a "map" (functional programming). There are a lot of ways of writing a "map" function in bash (using stdin, function args, ...), for example:

    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
    
    0 讨论(0)
  • 2021-01-18 08:18

    If you prefer Python:

    #!/bin/python
    num = input()
    while num:
        print(int(num) + 1) # Whatever manipulation you want
        try:
            num = input()
        except EOFError:
            break
    
    0 讨论(0)
  • 2021-01-18 08:19
    echo 1 2 3 4 5 | xargs -n 1 expr -1 +
    
    0 讨论(0)
  • 2021-01-18 08:20

    Yoi might like something like this:

    echo "1 2 3 4 5" | perl -ne 'print $_ ** 2, " " for split / /, $_'
    

    or even like this:

    echo "1 2 3 4 5" | perl -ne 'print join " ", map {$_ ** 2} split / /, $_'
    
    0 讨论(0)
  • 2021-01-18 08:21

    Using awk is another solution, which also works with floats

    echo "1 2 3 4 5" | xargs -n1 | awk '{print $1^2}' | xargs
    

    or use a loop

    for x in 1 2 3 4 5; do echo $((x**2)); done | xargs
    for x in $(echo "1 2 3 4 5"); do echo $x^2 | bc; done | xargs # alternative solution
    for x in $(seq 5); do python -c "print($x**2)"; done | xargs  # alternative solution but slower than the above
    # or make it neat by defining a function to do basic math in bash, e.g.:
    calc() { awk "BEGIN{print $*}"; } 
    for x in $(seq 5); do calc $x^2; done | xargs
    
    0 讨论(0)
  • 2021-01-18 08:22

    Or..

    echo "1 2 3 4 5" | xargs -n 1 | while read number 
     do
       echo $((number * number))
     done
    
    0 讨论(0)
提交回复
热议问题