Tengo el siguiente archivo:
AA,true
AA,false
BB,false
CC,false
BB,true
DD,true
Estoy tratando de buscar duplicados y eliminar la línea que tiene el valor de la columna igual true.
como salida debería ser:
AA,false
BB,false
CC,false
DD,true
text-processing
awk
sed
Hani Gotc
fuente
fuente

truesi es la primera instancia de la primera columna?AA,true AA,false AA,false AA,false¿Qué salida debería ser en este caso? Entiendo que esa fila debe eliminarse solo si tiene duplicados y contienetrueal mismo tiempo. Todas lasfalsefilas deben permanecer intactas en cualquier caso. Es decir, en este caso, soloAA, truese eliminará. Pero todas las respuestas dejan solo una línea -AA,false. Simplemente interesante :)Respuestas:
Para expandir el script verticalmente para explicación:
fuente
Versión simple:
"falso" se ordena alfabéticamente antes de "verdadero", y el comando Awk aquí solo mantiene la primera fila solo para cada primer valor de campo distinto.
Si desea mantener "verdadero" en lugar de "falso", ordénelo en reversa, páselo al mismo comando Awk y ordénelo en reversa nuevamente después.
fuente
-uopción está disponible,sort input.txt | sort -t, -u -k1,1sortllamadas? ¿Por qué no solosort -ut, -k1,1 input.txt?-uretendrá la primera línea encontrada del archivo de entrada entre los duplicados ... para un caso dado, la entrada debe clasificarse antes de-upoder aplicarse ... por ejemplo:AA,truese imprimirá en lugar deAA,falsecomo aparece primero en la muestra dada ... misma razón por la queawk -F, '!a[$1]++'solo no resolverá este problemaEstructuras de datos:
%hcuyas claves son los primeros campos (AAA, BBB, CCC, etc.) y los valores correspondientes son números que indican el orden en que se encontraron las claves. Así, por ejemplo, clave AAA => 0, clave BBB => 1, clave CCC => 2.@hcuyos elementos son líneas contenidas en el orden de impresión. Entonces, si se encuentran tanto verdadero como falso en los datos, entonces el valor falso irá a la matriz. OTW, si hay un tipo de datos, entonces estaría presente.Otra forma es usar GNU sed:
FWIW, el código POSIX equivalente para el código GNU-sed anterior se enumera a continuación:
Explicación
Resultados
fuente
Para cada línea de entrada, almacene el valor del segundo campo en una matriz asociativa
a(utilizando el primer campo como clave de la matriz) SOLAMENTE si aún no hemos almacenado el valorfalsepara esa clave. Úselo,tanto para el separador de campo de entrada como para el de salida. Imprima la matriz después de haber leído todas las líneas de entrada.La diferencia significativa entre esto y la versión de DopeGhoti es que a esta versión no le importa en absoluto el valor de
$2, solo le importa el valor, si lo hay, dea[$1].fuente
sortSolución de dos pasosPrimero
sortpase los grupos de registros por campo1confalseregistros que precedentruea cada bloque de registros que comparten un1valor de campo común . El segundosortpase está configurado para producir un registro para cada valor distinto dentro del campo,1cortesía de-u. Como-uimplica una clasificación estable, el único registro así obtenido es el primer registro encontrado para cada valor distinto dentro del campo1, que es un registrofalseen el segundo campo debido al trabajo realizado por el primersortpasofuente