Остерегайтесь этого, запустив
logrotate -vdf /etc/logrotate.conf
событие, хотя и смоделированное, будет зарегистрировано в /var/lib/logrotate.status
и последующие запуски logrotate ответят упомянутым
log does not need rotating
Обычно лучше работать со строками (строками ). Такие инструменты, как awk
, работают с одной строкой за раз. Чтобы преобразовать ваши столбцы в строки (, то есть транспонировать ), используйте GNUdatamash
. Затем awk
может сделать правильные тесты для каждой строки отдельно, печатать ее или нет. В конце снова используйте datamash
, чтобы преобразовать результат в исходный формат :
<data datamash transpose | awk '{
for (i=2; i<=5; i++) if ($1!=$i) next
for (i=6; i<=NF; i++) if ($1==$i) next
print
}' | datamash transpose
Объяснение логики:
for
пропускает строку и начинает сначала, если какое-либо из полей 2..5 отличается от номера поля 1. Все 5 полей равны, это единственная возможность, которая позволяет программе перейти к следующей строке кода. for
пропускает строку и начинает сначала, если любое из следующих полей совпадает с первым. for
s, то это означает, что никакого противоречия вашим критериям обнаружено не было. Только тогда печатается вся строка. Примечания:
datamash transpose
необходимо прочитать и обработать весь файл (или поток )независимо от данных. В этом контексте мое решение неоптимально. datamash
недоступен, есть awk
решение здесь .Нам нужно транспонировать столбцы в строки, а затем запустить проверку регулярным выражением, какие строки печатать. Те, у кого первые пять элементов совпадают, не должны видеть один и тот же элемент ниже. Наконец, повторно транспонируйте результат, чтобы получить желаемый результат.
ХТН.
rs -T inp |
perl -lane 'print if "@F" =~ /^(\S+)(?: \1){4}(?: (?:(?!\1(?=(?: |$))).)+)+$/' |
rs -T
Выход:
Jhon Ben Tom
Jhon Ben Tom
Jhon Ben Tom
Jhon Ben Tom
Jhon Ben Tom
Dave Taylor Sara
Dave Harvey Sara