Подсчитать столбцы, в которых есть как 0, так и 1

Найдите число либо в начале строки ( ^ ), либо которому предшествует нецифровое число ( [^ 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
0
01.04.2018, 17:33
6 ответов
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.

0
28.01.2020, 02:16

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
2
28.01.2020, 02:16

Сdatamash+awkпредположим, что ваши поля разделены одним пробелом:

$ datamash -t' ' transpose <infile | awk '/0/ && /1/{++C} END{print C}'
3
0
28.01.2020, 02:16

С BSDrs:

<file rs -T | grep -w 0 | grep -wc 1

Где:

  • rs -Tтранспонирует матрицу
  • grep -w 0выбирает строки (ранее столбцы ), которые содержат 0 как один wor
  • grep -wc 1подсчитывает количество оставшихся строк (исходных столбцов ), которые содержат 1как одно слово

Обратите внимание, однако, что слова для grep -wявляются последовательностями алнумов или знаков подчеркивания, поэтому, хотя 1не будет найдено в 10, оно будет найдено, если -1как -не является ни alnum, ни символом подчеркивания.

Если на входе может появиться -1, вы можете изменить его на :

.
<file rs -T | sed 's/.*/ & /' | grep ' 0 ' | grep -c ' 1 '
1
28.01.2020, 02:16

попробуй с (этим уродом)

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.

2
28.01.2020, 02:16

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
0
28.01.2020, 02:16

Теги

Похожие вопросы