Найдите число либо в начале строки ( ^
), либо которому предшествует нецифровое число ( [^ 0-9]
), а также в конце ( $
или [^ 0-9]
).
grep -E '(^|[^0-9])1234($|[^0-9])' file.txt
Если вы хотите разрешить нули в начале, добавьте 0 *
перед числом.
grep -E '(^|[^0-9])0*1234($|[^0-9])' file.txt
Если вы также хотите отклонить строки, содержащие любую последовательность из одной или нескольких цифр, которая не является частью вхождения этого конкретного числа, то вы ищете строки, состоящие из последовательностей, чередующихся с одной или несколькими нецифровыми цифрами и этим конкретным числом. , что в основном равно ([^ 0-9] +1234) *
. Строка может начинаться и заканчиваться как числом, так и нецифровым, тогда как внутренние последовательности нецифров могут быть не пустыми. Кроме того, строка должна содержать номер хотя бы один раз. Собираем все вместе:
grep -xE '[^0-9]*1234([^0-9]+1234)*[^0-9]*' file.txt
awk '
{
for (i=1;i<=NF;++i)
if ($i == 1) ++one[i]
else if ($i == 0) ++zero[i]
}
END {
for (i=1;i<=NF;++i)
c += (one[i]>0 && zero[i]>0)
print c
}' file
Это подсчитывает единицы и нули в двух отдельных массивах, one
и zero
. Они имеют одну запись на столбец во входном файле.
В конце переменная c
будет суммой количества столбцов, в которых есть как минимум один 1
и один 0
. Код предполагает, что количество столбцов в последней строке ввода такое же, как и в других строках входных данных.
Результатом этого с данным примером является 3
.
ruby удобен для работы с массивами массивов:
ruby -e '
rows = File.readlines( ARGV.shift ).map {|line| line.split}
columns = rows.transpose
puts columns.count {|column| column.include?("0") and column.include?("1")}
' file
или без переменных
ruby -e 'puts readlines
.map {|line| line.split}
.transpose
.count {|column| column.include?("0") and column.include?("1")}
' file
Сdatamash
+awk
предположим, что ваши поля разделены одним пробелом:
$ datamash -t' ' transpose <infile | awk '/0/ && /1/{++C} END{print C}'
3
С BSDrs
:
<file rs -T | grep -w 0 | grep -wc 1
Где:
rs -T
транспонирует матрицу grep -w 0
выбирает строки (ранее столбцы ), которые содержат 0 как один w
or grep -wc 1
подсчитывает количество оставшихся строк (исходных столбцов ), которые содержат 1
как одно слово Обратите внимание, однако, что слова для grep -w
являются последовательностями алнумов или знаков подчеркивания, поэтому, хотя 1
не будет найдено в 10
, оно будет найдено, если -1
как -
не является ни alnum, ни символом подчеркивания.
Если на входе может появиться -1
, вы можете изменить его на :
<file rs -T | sed 's/.*/ & /' | grep ' 0 ' | grep -c ' 1 '
попробуй с (этим уродом)
awk '{if ( NF>maxi) maxi =NF ;
for(i=1;i<=NF;i++) {if ( $i == 0 ) zero[i]=1 ;
if ($i ==1 ) one[i]=1 ;}}
END { for (i=1;i<=maxi;i++) if ( zero[i]+one[i]==2) print i ;}' file
это в основном устанавливает флаг для 0
и 1
для каждого столбца. сумма обоих должна быть 2.
Awk
раствор:
awk '{ for (i=1; i<=NF; i++) a[i] = (NR > 1? a[i] : "") $i; }
END{
for (i in a) if (a[i] ~ /(0.*1|1.*0)/) c++;
print c
}' file
Выход:
3