Как связать пользовательские функции bash с pipe - PullRequest
6 голосов
/ 23 июня 2011

с некоторых пор мне действительно нравятся функции bash. Давайте рассмотрим тот, который вычисляет среднее значение из n-го столбца файла:

avg () { awk -v c="$2" '{n+=$c;m++} END{print n/m,m}' < "$1"; }

Можно ли переписать его таким образом, чтобы он считывал данные из канала? То есть использовать функцию в следующем:

cat data.txt | avg

1 Ответ

5 голосов
/ 23 июня 2011
avg () { awk -v c="$1" '{n+=$c;m++} END{print n/m,m}'; }
(echo 1 3; echo 2 4; echo 4 6) | avg 2
avg 2 < /tmp/file

Если вы хотите сохранить API:

avg () { (if [ "x$1" = "x-" ]; then cat; else cat $1; fi) | awk -v c="$2" '{n+=$c;m++} END{print n/m,m}'; }
(echo 1 3; echo 2 4; echo 4 6) | avg - 2
avg /tmp/file 2
...