linux pipe как вывести значения на шаг назад - PullRequest
1 голос
/ 25 июня 2019

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

#befor filtering, printing number of all lines
less /etc/passwd | awk -F: '{print $1, $3}' | wc -l 

#after filtering, printing number of filtered lines
less /etc/passwd | awk -F: '{print $1, $3}' | awk '$2 >= 47{print $0}' | wc -l

Но я не могу понять, как я могу получить эти два значения из одной строки кода.Любое предложение будет отличным.Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

С awk

awk -F: '{i++} $3>=47 {j++} END {print "total="i,"\n>46="j}' /etc/passwd
total=40
>46=23

i++ приращение i для каждой строки дает общее значение.
$3>=47 {j++} Проверка, если поле 3 больше 46
print "total="i,"\n>46="j Печать iи j

Короткое, насколько это возможно: проверка на larger than 46, поскольку она равна larger than and equal to 47

awk -F: '{i++}$3>46{j++}END{print i,j}' /etc/passwd

Как отмечает Эд, NR (Количество записей) делаетсодержит всего записей.
Так еще короче:

awk -F: '$3>46{j++}END{print NR,j}' /etc/passwd
1 голос
/ 25 июня 2019

В bash вы можете "разделить" каналы, используя tee и дескрипторы файлов:

less /etc/passwd | awk -F: '{print $1, $3}' | tee >(awk '$2 >= 47{print $0}' >(wc -l) | wc -l)
...