У меня есть следующий файл:
AA,true
AA,false
BB,false
CC,false
BB,true
DD,true
Я пытаюсь найти дубликаты и удалить строку, значение столбца которой равно true
.
в качестве вывода это должно быть:
AA,false
BB,false
CC,false
DD,true
text-processing
awk
sed
Хани Готц
источник
источник
true
если это первый экземпляр первого столбца?AA,true AA,false AA,false AA,false
Какой вывод должен быть в этом случае? Я понимаю, что этот ряд следует удалять только в том случае, если он дублирует и содержитtrue
одновременно. Вfalse
любом случае все ряды должны оставаться нетронутыми. То есть в этом случаеAA, true
будут только удалены. Но все ответы оставляют только одну строчку -AA,false
. Просто интересно :)Ответы:
Чтобы развернуть скрипт вертикально для объяснения:
источник
Простая версия:
«false» сортирует в алфавитном порядке перед «true», и здесь команда Awk просто сохраняет первую строку только для каждого отдельного значения первого поля.
Если вы хотите оставить «true» вместо «false», выполните обратную сортировку, передайте ее той же команде Awk и затем снова выполните обратную сортировку.
источник
-u
опция доступна,sort input.txt | sort -t, -u -k1,1
sort
звонка? Почему не простоsort -ut, -k1,1 input.txt
?-u
что сохранит первую строку, найденную из входного файла среди дубликатов ... для данного случая вход должен быть отсортирован до того, как его-u
можно будет применить ... для ex:AA,true
будет напечатан вместо,AA,false
поскольку он появляется первым в данном примере .. та же причина, почемуawk -F, '!a[$1]++'
одни не решат эту проблемуСтруктуры данных:
%h
, ключи которого являются первыми полями (AAA, BBB, CCC и т. Д.), А соответствующие значения являются числами, указывающими порядок, в котором встречались ключи. Таким образом, например, ключ AAA => 0, ключ BBB => 1, ключ CCC => 2.@h
, элементами которого являются строки, содержащиеся в порядке печати. Таким образом, если в данных найдены как истина, так и ложь, тогда ложное значение попадет в массив. OTW, если есть один тип данных, то это будет присутствовать.Другой способ - использовать GNU sed:
FWIW, эквивалентный код POSIX для приведенного выше кода GNU-sed приведен ниже:
объяснение
Результаты
источник
Для каждой строки ввода сохраняйте значение второго поля в ассоциативном массиве
a
(используя первое поле в качестве ключа массива), ТОЛЬКО если мы еще не сохранили значениеfalse
для этого ключа. Используется,
как для ввода, так и для вывода разделителя полей. Распечатайте массив после того, как мы прочитали все строки ввода.Существенное различие между этой версией и версией DopeGhoti состоит в том, что эта версия не заботится о значении
$2
, она заботится только о значении, если таковое имеетсяa[$1]
.источник
Двухходовое
sort
решениеСначала
sort
передайте записи кластеров по полю1
сfalse
записями, предшествующимиtrue
каждому блоку записей, имеющему общее1
значение поля . Второйsort
проход настроен на выход одну запись для каждого отдельного значения в пределах поля1
любезно-u
. поскольку-u
подразумевается стабильная сортировка, одна полученная таким образом запись является первой записью, встреченной для каждого отдельного значения в поле1
- которая является записьюfalse
во втором поле из-за работы, проделанной первымsort
проходомисточник