Probablemente usaría sed
para este trabajo:
line=3
sed -e "${line}r file2" file1
Si desea sobrescribir file1
y tienes GNU sed
, agrega el -i
opción. De lo contrario, escriba en un archivo temporal y luego copie/mueva el archivo temporal sobre el original, limpiando según sea necesario (ese es el trap
cosas de abajo). Nota:copiar el temporal sobre el archivo conserva los enlaces; mover no lo hace (pero es más rápido, especialmente si el archivo es grande).
line=3
tmp="./sed.$$"
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
sed -e "${line}r file2" file1 > $tmp
cp $tmp file1
rm -f $tmp
trap 0
Solo por diversión y porque a todos nos encanta ed
, el editor estándar, aquí hay un ed
versión. Es muy eficiente (ed
es un genuino editor de texto)!
ed -s file2 <<< $'3r file1\nw'
Si el número de línea se almacena en la variable line
entonces:
ed -s file2 <<< "${line}r file1"$'\nw'
Solo para complacer a Zack, aquí hay una versión con menos bashism, en caso de que no te guste bash (personalmente, no me gustan las tuberías y subcapas, prefiero herestrings, pero bueno, como dije, eso es solo para complacer a Zack):
printf "%s\n" "${line}r file1" w | ed -s file2
o (para complacer a Sorpigal):
printf "%dr %s\nw" "$line" file1 | ed -s file2
Como menciona Jonathan Leffler en un comentario, y si tiene la intención de usar este método en un script, use un heredoc (generalmente es el más eficiente):
ed -s file2 <<EOF
${line}r file1
w
EOF
¡Espero que esto ayude!
PD No dude en dejar un comentario si siente que necesita expresarse sobre las formas de conducir ed
, el editor estándar.
cat file1 >>file2
agregará el contenido del archivo 1 al archivo 2.
cat file1 file2
concatenará archivo1 y archivo2 y enviará la salida a la terminal.
cat file1 file2 >file3
creará o sobreescribirá archivo3 con la concatenación de archivo1 y archivo2
cat file1 file2 >>file3
agregará la concatenación del archivo 1 y el archivo 2 al final del archivo 3.
Editar :
Para troncalizar el archivo2 antes de agregar el archivo1:
sed -e '11,$d' -i file2 && cat file1 >>file2
o para hacer un archivo de 500 líneas:
n=$((500-$(wc -l <file1)))
sed -e "1,${n}d" -i file2 && cat file1 >>file2