Comparar script usando AWK y Bash -- bash campo con linux campo con awk camp codereview Relacionados El problema

Compare script using awk and bash


0
vote

problema

Español

Intento crear Comparar Script usando AWK y otro comando y ejecutando éxito.

Pero creo que el script que creo es largo.

¿Hay alguien que pueda acortar mi script a continuación?

Después del plan A shorten the code than , el plan B es:

  newCombo()0  

Es un placer si alguien puede ayudarme

A continuación se muestra el código que creo en base a la búsqueda y lo intenté.
  newCombo()1  
Original en ingles

I try to create compare script using awk and another command and running successful.

But I think the script I create it's to long.

Is there anyone can shorten my script below ?

After plan A shorten the code than, plan B is :

 1. I want eliminated a lot temp file (.txt), only need `lengkap.txt`  2. Put command in variable if can 

It's my pleasure if anyone can help me

Below is the code that I create based searching and trying.
#!/bin/bash  ### Path Folder who will be compare ### path1=/home/rio/apps1 path2=/home/rio/apps2  ### Find all filename and convert to MD5 ### find $path1 -type f | xargs md5sum > checksums.md5 find $path2 -type f | xargs md5sum > checksums2.md5  ### Compare to find different folder ### awk 'NR==FNR{c[$1]++;next};c[$1] == 0' checksums.md5 checksums2.md5 > hasil1.txt awk 'NR==FNR{c[$1]++;next};c[$1] == 0' checksums2.md5 checksums.md5 > hasil2.txt  ### Merge result of compare ### awk '{print $0}' hasil1.txt hasil2.txt > perbedaan.txt  ### Filter Just Filename Difference ### cat perbedaan.txt | awk '{print $2}' > hasilperbedaan.txt  ### File about result compare (just filename) ### cekhasil=/home/rio/hasilperbedaan.txt  ### Check if File result compare empty or not ### if [ -s "$cekhasil" ] then     echo " file exists and is not empty "     ### Find All filename and date, after that put as we want ###     find $path1 -type f -ls | awk '{print $11" "$8" "$9" "$10 }' > filedate1.txt     find $path2 -type f -ls | awk '{print $11" "$8" "$9" "$10 }' > filedate2.txt      ### Compare to get the date of filename ###     awk 'A[$1]++' hasilperbedaan.txt filedate1.txt > pre_hasil1.txt     awk 'A[$1]++' hasilperbedaan.txt filedate2.txt > pre_hasil2.txt     ### Merge result of compare with date ###     awk '{print $0}' pre_hasil1.txt pre_hasil2.txt > lengkap.txt else    echo " file does not exist, or is empty " fi 
        
         
         

Lista de respuestas

3
 
vote

Bueno, se tomó tiempo para averiguar qué está haciendo su programa. Así que lo acorté en dos fases.

Primera fase: eliminé todos los archivos temporales duplicados, y usé una tubería cuando se usó un archivo temporal una vez.

Paso 1: Simplemente haga una suma de comprobación de todos los archivos en $ PATH1 y $ PATH2

  ### Find all filename and convert to MD5 ### find $path1 -type f | xargs md5sum > checksums.md5 find $path2 -type f | xargs md5sum > checksums2.md5   

No necesita 2 archivos temporales, ya que la ruta está incluida en el nombre de archivo. Por lo tanto, puede reemplazar esto con un solo find . Yo uso sort para poder usar uniq después:

  find "$path1" "$path2" -type f | xargs md5sum  | sort > cksum.md5   

PASO2: Encuentre cheques únicos en ambos archivos y obtenga los nombres de archivo correspondientes.

  ### Compare to find different folder ### awk 'NR==FNR{c[$1]++;next};c[$1] == 0' checksums.md5 checksums2.md5 > hasil1.txt awk 'NR==FNR{c[$1]++;next};c[$1] == 0' checksums2.md5 checksums.md5 > hasil2.txt  ### Merge result of compare ### awk '{print $0}' hasil1.txt hasil2.txt > perbedaan.txt  ### Filter Just Filename Difference ### cat perbedaan.txt | awk '{print $2}' > hasilperbedaan.txt   

Como contamos con un archivo ordenado por su suma de comprobación, simplemente filtros con uniq y obtenga los nombres de archivo.

nota : A medida que usamos una suma de comprobación MD5 (128 bits), la longitud es 128BITS / 8BITS * 2HEX = 32

  uniq -u -w32 cksum.md5 | awk '{print $2}' > "$cekhasil"   

Si prefiere awk para UNIQ, solo compare los $ 1 del registro anterior con la corriente.

Paso 3: coincide con las entradas encontradas con una nueva búsqueda ( find ) en las dos rutas de origen.

  if [ -s "$cekhasil" ] then     echo " file exists and is not empty "     ### Find All filename and date, after that put as we want ###     find $path1 -type f -ls | awk '{print $11" "$8" "$9" "$10 }' > filedate1.txt     find $path2 -type f -ls | awk '{print $11" "$8" "$9" "$10 }' > filedate2.txt      ### Compare to get the date of filename ###     awk 'A[$1]++' hasilperbedaan.txt filedate1.txt > pre_hasil1.txt     awk 'A[$1]++' hasilperbedaan.txt filedate2.txt > pre_hasil2.txt     ### Merge result of compare with date ###     awk '{print $0}' pre_hasil1.txt pre_hasil2.txt > lengkap.txt else     echo " file does not exist, or is empty " fi   

Aquí, es mejor evitar el nuevo 9988776655544339 , y simplemente bucle sobre los nombres de archivo.

  find0  

AllToTether, el script se convierte en:

  find1  

En este punto, podemos notar que los 2 archivos temporales restantes se usan solo una vez. Simplemente nos deshacemos de ellos, y solo 99887766555443312 todos juntos para obtener el archivo de salida.

  find3  

Notes :

  • No entiendo su segunda pregunta: "Ponga el comando en la variable si puede ", así que me salto de uno.
  • Usted debe nunca use la salida de find4 (excepto con 99887776655443315 ) o 99887766555443316 como entrada de Cualquier comando. Pero está fuera de margen para esta respuesta.
 

Well, it took time to figure out what your program is doing. So I did shorten it in two phases.

First phase: I removed all duplicate temporary files, and used a pipe when a temp file was used once.

STEP1: you just make a checksum of all files in $path1 and $path2

### Find all filename and convert to MD5 ### find $path1 -type f | xargs md5sum > checksums.md5 find $path2 -type f | xargs md5sum > checksums2.md5 

You don't need 2 temp files, as path is included in filename. So you can replace this with a single find. I use sort to be able to use uniq afterwards:

find "$path1" "$path2" -type f | xargs md5sum  | sort > cksum.md5 

STEP2: you find unique checksums in both files, and get the corresponding filenames.

### Compare to find different folder ### awk 'NR==FNR{c[$1]++;next};c[$1] == 0' checksums.md5 checksums2.md5 > hasil1.txt awk 'NR==FNR{c[$1]++;next};c[$1] == 0' checksums2.md5 checksums.md5 > hasil2.txt  ### Merge result of compare ### awk '{print $0}' hasil1.txt hasil2.txt > perbedaan.txt  ### Filter Just Filename Difference ### cat perbedaan.txt | awk '{print $2}' > hasilperbedaan.txt 

As we have a checksum-sorted file, we just filter with uniq, and get filenames.

Note: As we use a MD5 checksum (128 bits), length is 128bits / 8bits * 2hex=32

uniq -u -w32 cksum.md5 | awk '{print $2}' > "$cekhasil" 

If you prefer awk to uniq, just compare previous record's $1 with current's.

STEP 3: you match found entries with a new search (find) in the two source paths.

if [ -s "$cekhasil" ] then     echo " file exists and is not empty "     ### Find All filename and date, after that put as we want ###     find $path1 -type f -ls | awk '{print $11" "$8" "$9" "$10 }' > filedate1.txt     find $path2 -type f -ls | awk '{print $11" "$8" "$9" "$10 }' > filedate2.txt      ### Compare to get the date of filename ###     awk 'A[$1]++' hasilperbedaan.txt filedate1.txt > pre_hasil1.txt     awk 'A[$1]++' hasilperbedaan.txt filedate2.txt > pre_hasil2.txt     ### Merge result of compare with date ###     awk '{print $0}' pre_hasil1.txt pre_hasil2.txt > lengkap.txt else     echo " file does not exist, or is empty " fi 

Here, it is better to avoid new full find, and just loop over filenames.

if [ -s "$cekhasil" ] then     echo " file exists and is not empty "     while read -r fn ; do         ls -dils "$fn" | awk '{print $11" "$8" "$9" "$10 }'     done < "$cekhasil" > lengkap2.txt  else     echo " file does not exist, or is empty " fi 

Alltogether, the script becomes:

#!/bin/bash  path1=/home/br/dev/tools/bash path2=/home/br/dev/tools/bash2 outfile=hasilperbedaan.txt  find "$path1" "$path2" -type f | xargs md5sum  | sort > cksum.md5  uniq -u -w32 cksum.md5 | awk '{print $2}' > "$outfile"  if [ -s "$outfile" ]; then     echo " file exists and is not empty "     while read -r fn ; do         ls -dils "$fn" | awk '{print $11" "$8" "$9" "$10 }'     done < "$output" > lengkap2.txt  else     echo " file does not exist, or is empty " fi 

At this point, we can notice the 2 remaining temp files are used only once. We just get rid of them, and just pipe all together to get the output file.

    #!/bin/bash          path1=/home/br/dev/tools/bash     path2=/home/br/dev/tools/bash2     outputfile="lengkap-v2.txt"          find "$path1" "$path2" -type f | xargs md5sum  | sort |         uniq -u -w32 | awk '{print $2}' |         while read -r fn ; do             ls -dils "$fn" | awk '{print $11" "$8" "$9" "$10 }'         done > "$outputfile"     [[ -s "$outputfile" ]] && echo " file exists and is not empty " ||             echo " file does not exist, or is empty " 

Notes:

  • I don't understand your second question: "Put command in variable if can", so I skip that one.
  • You should never use the output of find (except with -print0 options) or ls as input of any command. But it is out of scope for this answer.
 
 

Relacionados problema

2  Listado de imágenes Docker sin registro URI  ( Listing docker images without registry uri ) 
Tengo un registro de contenedores privados detrás de un firewall que necesitará algunas imágenes de registro de Google. Para asegurarse de que las cosas sean ...

4  Extracción de entradas de campo duplicado de los datos de CSV ordenados  ( Removing duplicate field entries from sorted csv data ) 
Dada la siguiente entrada ( cat i.txt ), Quiero eliminar entradas de campo duplicadas en cada una de las tres primeras columnas y ninguna de las otras. DLO...

5  Lista de uso del disco del directorio  ( Directorys disk usage list ) 
Para mis clases, tuve que terminar esta tarea: Lista de uso del disco de directorio para el directorio indicado Imprime una lista de archivos y subdire...

2  Bash Script Wallpaper Randomizer  ( Bash script wallpaper randomizer ) 
Pensé que sería divertido escribir un script simple y pequeño Bash que elige al azar un fondo de pantalla de un directorio determinado de un conjunto de imáge...

3  Script de bash para administrar notas de hashtag  ( Bash script for managing hashtag notes ) 
He escrito un script simple para administrar las notas de Hashtag. No estoy familiarizado con la scriptación de bash, así que realmente lo apreciaría si alg...

4  Retire cada línea que incluya y siga la segunda ocurrencia de un patrón dado  ( Remove every line that include and follows the second occurrence of a given patt ) 
De un archivo, estoy tratando de eliminar cada línea que incluya y siga la segunda ocurrencia de un patrón dado en Bash (Mac OSX). Tenga en cuenta que un arch...

4  Script de cáscara de filtro para encontrar líneas que contienen todos los patrones especificados  ( Filter shell script to find lines that contain all specified patterns ) 
Escribí un script que hace lo siguiente: Ejecute otro script en el sistema filtra la salida para encontrar líneas que contienen todos los patrones dados ...

6  Script Shell para contar los resultados del juego de ajedrez  ( Shell script to count chess game outcomes ) 
Me encontré con este Blog Post de Adam Drake de aproximadamente un año, que ahora está haciendo las rondas otra vez . Hice algunas mejoras en su código, ...

0  Seleccione una línea específica después de hacer coincidir un patrón  ( Select a specific line after matching a pattern ) 
Recientemente comencé a usar awk y todavía estoy aprendiendo al respecto. He resuelto el problema que estoy a punto de mostrar, pero siento que no es la mejor...

0  Cargando un archivo en VIM a través de la salida de tubos de AG  ( Loading a file in vim via piped output of ag ) 
Me siento como si mi escenario fuera bastante simple, pero que podría sobrecomplicarlo. Estoy buscando a través de archivos en busca de una condición especi...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos