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
true
si 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 contienetrue
al mismo tiempo. Todas lasfalse
filas deben permanecer intactas en cualquier caso. Es decir, en este caso, soloAA, true
se 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
-u
opción está disponible,sort input.txt | sort -t, -u -k1,1
sort
llamadas? ¿Por qué no solosort -ut, -k1,1 input.txt
?-u
retendrá la primera línea encontrada del archivo de entrada entre los duplicados ... para un caso dado, la entrada debe clasificarse antes de-u
poder aplicarse ... por ejemplo:AA,true
se imprimirá en lugar deAA,false
como aparece primero en la muestra dada ... misma razón por la queawk -F, '!a[$1]++'
solo no resolverá este problemaEstructuras de datos:
%h
cuyas 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.@h
cuyos 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 valorfalse
para 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
sort
Solución de dos pasosPrimero
sort
pase los grupos de registros por campo1
confalse
registros que precedentrue
a cada bloque de registros que comparten un1
valor de campo común . El segundosort
pase está configurado para producir un registro para cada valor distinto dentro del campo,1
cortesía de-u
. Como-u
implica una clasificación estable, el único registro así obtenido es el primer registro encontrado para cada valor distinto dentro del campo1
, que es un registrofalse
en el segundo campo debido al trabajo realizado por el primersort
pasofuente