Datamash GNU отлично подходит для подобных вещей:
$ datamash -sW groupby 1 max 2,3 < ifile.dat
1 40 76
2 20 98
3 34 33
4 50 100
5 3 46
Чтобы обрабатывать большее количество столбцов, вы можете указать диапазон , например.
datamash -sW groupby 1 max 2-13 < ifile.dat
Попробуйте это,
grep -oc are file
-o
Печатать только совпадающую часть. -c
вывести количество совпадающих строк. Вы можете добавить опцию -i
, если вам также нужен результат для Are
. Который будет игнорировать чувствительность к регистру соответствующего шаблона
Если у нас есть несколько совпадающих шаблонов в одной строке...
grep -o are file | wc -l
Использование AWK:
awk -F ',' '$4 ~ /are/ {count++} END{print count}' file
awk -F ',' '$4 ~ /[Aa]re/ {count++} END{print count}' file
Вот два способа решения этой проблемы:
sed -Ee '
y/,/\n/;s/\n/,/3;s//,/3;y/\n,/,\n/
s/.*\n(.*)\n.*/\1/;s/\<[aA][rR][eE]\>/\n/g
s/[^\n]*//g;/\n/!d;s///
' file.csv | wc -l
Здесь мы используем GNU sed
и в режиме расширенного регулярного выражения. Идея состоит в том, чтобы сначала изолировать четвертое поле, а затем в нечувствительном к регистру -способе превращает все слова (s )"are", найденные в пространстве шаблонов, теперь в новую строку (s ). Затем удалите любую строку (s )без новой строки и уберите новую строку вместо sed
размещения ее собственной каждый раз, когда она что-то печатает на стандартный вывод. затем мы подсчитываем количество строк, выведенных sed
, что дает нам сумму всех нечувствительных к регистру шаблонов слова «есть» в четвертых полях каждой строки.
perl -F, -lane '
$k += split /(?<=\Ware)(?=\W)/i, $F[3];
}{print $k-$.;
' file.csv
Perl
мы разделяем четвертое поле($F[3]
)вокруг падежа -нечувствительного слова "are", определяемого окружением "are" с \Ws на обоих концах. затем мы обновляем количество разделенных полей. Обратите внимание, что количество полей всегда должно быть на 1 больше, чем количество слов «есть».
В конце, когда все строки прочитаны и обработаны, мы печатаем количество минус количество строк в файле.