GNU/Linux >> Tutoriales Linux >  >> Linux

¿Herramientas de Linux para tratar archivos como conjuntos y realizar operaciones de conjuntos en ellos?

¿Alguien sabe de alguna herramienta de Linux diseñada específicamente para tratar archivos como conjuntos y realizar operaciones de conjuntos en ellos? ¿Como diferencia, intersección, etc.?

Respuesta aceptada:

Suponiendo que los elementos sean cadenas de caracteres que no sean NUL y nueva línea (aunque tenga en cuenta que la nueva línea es válida en los nombres de archivo), puede representar un conjunto como un archivo de texto con un elemento por línea y use algunas de las utilidades estándar de Unix.

Establecer membresía

$ grep -Fxc 'element' set   # outputs 1 if element is in set
                            # outputs >1 if set is a multi-set
                            # outputs 0 if element is not in set

$ grep -Fxq 'element' set   # returns 0 (true)  if element is in set
                            # returns 1 (false) if element is not in set

$ awk '$0 == "element" { s=1; exit }; END { exit !s }' set
# returns 0 if element is in set, 1 otherwise.

$ awk -v e='element' '$0 == e { s=1; exit } END { exit !s }'

Establecer intersección

$ comm -12 <(sort set1) <(sort set2)  # outputs intersect of set1 and set2

$ grep -xF -f set1 set2

$ sort set1 set2 | uniq -d

$ join -t <(sort A) <(sort B)

$ awk '!done { a[$0]; next }; $0 in a' set1 done=1 set2

Establecer igualdad

$ cmp -s <(sort set1) <(sort set2) # returns 0 if set1 is equal to set2
                                   # returns 1 if set1 != set2

$ cmp -s <(sort -u set1) <(sort -u set2)
# collapses multi-sets into sets and does the same as previous

$ awk '{ if (!($0 in a)) c++; a[$0] }; END{ exit !(c==NR/2) }' set1 set2
# returns 0 if set1 == set2
# returns 1 if set1 != set2

$ awk '{ a[$0] }; END{ exit !(length(a)==NR/2) }' set1 set2
# same as previous, requires >= gnu awk 3.1.5

Establecer Cardinalidad

$ wc -l < set     # outputs number of elements in set

$ awk 'END { print NR }' set

$ sed '$=' set

Prueba de subconjunto

$ comm -23 <(sort -u subset) <(sort -u set) | grep -q '^'
# returns true iff subset is not a subset of set (has elements not in set)

$ awk '!done { a[$0]; next }; { if !($0 in a) exit 1 }' set done=1 subset
# returns 0 if subset is a subset of set
# returns 1 if subset is not a subset of set

Establecer unión

$ cat set1 set2     # outputs union of set1 and set2
                    # assumes they are disjoint

$ awk 1 set1 set2   # ditto

$ cat set1 set2 ... setn   # union over n sets

$ sort -u set1 set2  # same, but doesn't assume they are disjoint

$ sort set1 set2 | uniq

$ awk '!a[$0]++' set1 set2       # ditto without sorting

Complemento del conjunto

$ comm -23 <(sort set1) <(sort set2)
# outputs elements in set1 that are not in set2

$ grep -vxF -f set2 set1           # ditto

$ sort set2 set2 set1 | uniq -u    # ditto

$ awk '!done { a[$0]; next }; !($0 in a)' set2 done=1 set1

Establecer diferencia simétrica

$ comm -3 <(sort set1) <(sort set2) | tr -d 't'  # assumes not tab in sets
# outputs elements that are in set1 or in set2 but not both

$ sort set1 set2 | uniq -u

$ cat <(grep -vxF -f set1 set2) <(grep -vxF -f set2 set1)

$ grep -vxF -f set1 set2; grep -vxF -f set2 set1

$ awk '!done { a[$0]; next }; $0 in a { delete a[$0]; next }; 1;
       END { for (b in a) print b }' set1 done=1 set2

Conjunto de energía

Todos los subconjuntos posibles de un conjunto se muestran separados por espacios, uno por línea:

$ p() { [ "$#" -eq 0 ] && echo || (shift; p "[email protected]") |
        while read r; do printf '%s %sn%sn' "$1" "$r" "$r"; done; }
$ p $(cat set)

(se supone que los elementos no contienen SPC, TAB (suponiendo el valor predeterminado de $IFS) ), barra invertida, caracteres comodín).

Relacionado:¿Qué software de compresión de archivos para Linux ofrece la mayor reducción de tamaño?

Establecer producto cartesiano

$ while IFS= read -r a; do while IFS= read -r b; do echo "$a, $b"; done < set1; done < set2

$ awk '!done { a[$0]; next }; { for (i in a) print i, $0 }' set1 done=1 set2

Prueba de conjuntos disjuntos

$ comm -12 <(sort set1) <(sort set2)  # does not output anything if disjoint

$ awk '++seen[$0] == 2 { exit 1 }' set1 set2 # returns 0 if disjoint
                                             # returns 1 if not

Prueba de conjunto vacío

$ wc -l < set            # outputs 0  if the set is empty
                         # outputs >0 if the set is not empty

$ grep -q '^' set        # returns true (0 exit status) unless set is empty

$ awk '{ exit 1 }' set   # returns true (0 exit status) if set is empty

Mínimo

$ sort set | head -n 1   # outputs the minimum (lexically) element in the set

$ awk 'NR == 1 { min = $0 }; $0 < min { min = $0 }; END { print min }'
# ditto, but does numeric comparison when elements are numerical

Máximo

$ sort test | tail -n 1    # outputs the maximum element in the set

$ sort -r test | head -n 1

$ awk '$0 > max { max = $0 }; END { print max }'
# ditto, but does numeric comparison when elements are numerical

Todo disponible en http://www.catonmat.net/blog/set-operations-in-unix-shell-simplified/


Linux
  1. 5 herramientas de línea de comandos para encontrar archivos rápidamente en Linux

  2. Cómo archivar y comprimir archivos en Linux

  3. Linux:almacenado en archivos /dev/pts y ¿podemos abrirlos?

  4. Linux:¿directorios estándar y/o comunes en sistemas operativos Unix/linux?

  5. Linux Eliminar archivos y directorios

Cómo establecer y enumerar variables de entorno en Linux

Las 3 mejores herramientas para buscar y eliminar archivos duplicados en Linux

Cómo encontrar archivos duplicados en Linux y eliminarlos

Encuentre archivos y directorios en Linux fácilmente

Cómo configurar la fecha y la hora en Linux

Configure Cron Jobs para Linux y las 10 mejores herramientas en línea para Cron Jobs