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. Sifile1.txt
tiene una línea vacía yfile2.txt
también tiene una línea vacía en el mismo lugar, el resultado es una línea vacía enfile3.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