Уникальная сортировка сделает это.
$ sort -u input.txt
2019-02-17 not active
2019-02-18 active
2019-02-19 active
2019-02-19 not active
2019-02-20 active
2019-02-21 not active
2019-02-22 not active
Кстати, sort input.txt | uniq
делает то же самое, а uniq
имеет опцию -f
для пропуска полей при определении уникальности, опции -d
и -D
, если вы хотите напечатать не -уникальные строки а не только уникальные.
В качестве альтернативы, если вы хотите, чтобы только одна строка вывода на дату и чтобы любая «активная» запись имела приоритет над «неактивной» (или другими )записями:
perl -lane '
$date=shift @F;
$day{$date} = join(" ",@F) unless ($day{$date} eq "active");
END {print $_. " ". $day{$_} for (sort keys %day)}' input.txt
2019-02-17 not active
2019-02-18 active
2019-02-19 active
2019-02-20 active
2019-02-21 not active
2019-02-22 not active
Это создает хэш(%day
)с датами в качестве ключей и остальными полями в качестве значений.Текущее или последнее -увиденное значение для любого данного дня заменит более раннее -увиденное значение , если значение для любого данного дня уже не является "активным". В этом случае значение дня не будет заменено.
Когда все входные данные прочитаны, хэш %day сортируется и печатается.
Это более полезно и повторно -применимо, чем полагаться на порядок сортировки второго поля. например, если вы хотите, чтобы «zzzzz» имел приоритет, а не «действие». Также полезно, если второе поле может содержать что-то, что отсортировано перед «действием» (, например. номер)
Я столкнулся с почти точно такой же проблемой при работе с CUPS.
2021/02/01 19:19:22 socat[645] E write(6, 0x557e0b9735a0, 8192): Broken pipe
Мое решение состоит в том, чтобы каждый раз удваивать размер блока socat и тестировать. Моя ситуация заканчивается socat -b 65536...
.
socat -b 16384...
...
socat -b 65536...