verificar script redireccionamiento palabra existencia existe exacta etc ejemplos comandos comando buscar archivo bash awk cut

script - ¿Cómo llenar líneas vacías de un archivo con las líneas correspondientes de otro archivo, en BASH?



verificar existencia de archivo en shell (6)

Aquí hay una solución Bash only.

for i in 1 2; do while read line; do if [ $i -eq 1 ]; then arr1+=("$line") else arr2+=("$line") fi done < file${i}.txt done for r in ${!arr1[@]}; do if [[ -n ${arr1[$r]} ]]; then echo ${arr1[$r]} else echo ${arr2[$r]} fi done > file3.txt

Tengo dos archivos, file1.txt y file2.txt . Cada uno tiene un número idéntico de líneas, pero algunas de las líneas en file1.txt están vacías. Esto es más fácil de ver cuando el contenido de los dos archivos se muestra en paralelo:

file1.txt file2.txt cat bear fish eagle spider leopard snail catfish rainbow trout snake koala rabbit fish

Necesito ensamblar estos archivos juntos, de modo que las líneas vacías en file1.txt se llenen con los datos encontrados en las líneas (del mismo número de línea) de file2.txt . El resultado en file3.txt se vería así:

cat fish spider snail catfish snake koala rabbit

Lo mejor que puedo hacer hasta ahora es crear un ciclo while read -r line , crear un contador que cuente cuántas veces ha bucle while, luego usar un if-conditional para verificar si $line está vacío, luego usar cut para obtenga el número de línea de file2.txt acuerdo con el número en el contador. Este método parece realmente ineficiente.

  • A veces, el file2.txt puede contener algunas líneas vacías. Si file1.txt tiene una línea vacía y file2.txt también tiene una línea vacía en el mismo lugar, el resultado es una línea vacía en file3.txt .

¿Cómo puedo completar las líneas vacías en un archivo con las líneas correspondientes de otro archivo?


Solo por diversión:

paste file1.txt file2.txt | sed -E ''s/^ //g'' | cut -f1

Esto borra las pestañas que están al principio de una línea (las que faltan en el archivo1) y luego toma la primera columna.

(Para OSX, /t no funciona en sed, por lo que para obtener el caracter TAB, escribe ctrl-V y luego Tab)


Uno con getline (inofensivo en este caso):

awk ''{getline p<f; print NF?$0:p; p=x}'' f=file2 file1


una solución sin awk:

paste -d"#" file1 file2 | sed ''s/^#/(.*/)//1/'' | cut -d"#" -f1


paste file1.txt file2.txt | awk -F ''/t'' ''$1 { print $1 ; next } { print $2 }''


Esta es la forma de manejar estos archivos con awk :

awk ''FNR==NR {a[NR]=$0;next} {print (NF?$0:a[FNR])}'' file2 file1 cat fish spider snail catfish snake koala rabbit

Primero, almacena todos los datos del file2 en a matriz usando a número de registro como índice
Luego imprime el file1 , mételo primero si el archivo1 contiene datos para cada registro
Si hay datos para este registro, utilícelo, si no, obtenga uno del file2