Puede usar un bucle de una sola línea como este:
for f in file1 file2 file3; do sed -i "s/$/\t$f/" $f; done
Para cada archivo en la lista, esto usará sed
para agregar al final de cada línea una pestaña y el nombre del archivo.
Explicación:
- Uso del
-i
marcar consed
para realizar un reemplazo en el lugar, sobrescribiendo el archivo - Realizar una sustitución con
s/PATTERN/REPLACEMENT/
. En este ejemplo, el PATRÓN es$
, el final de la línea y REEMPLAZO es\t
(=una TAB), y$f
es el nombre del archivo, de la variable de bucle. Els///
El comando está entre comillas dobles para que el shell pueda expandir las variables.
Vamos, ¿por qué recomiendan esas poderosas herramientas cuando hay paste
? ¡comando!
$ cat a
A
B
C
D
$ cat b
1
2
3
4
$ paste a b
A 1
B 2
C 3
D 4
Con un pequeño truco, podrías usar paste
para el propósito del OP. Sin embargo, no reemplazará los archivos en su lugar:
for f in file1 file2 file3; do
paste $f <(yes $f | head -n $(cat $f | wc -l)) > $f.new
done
Esto pegará el nombre de archivo respectivo como la última columna de cada archivo en el nuevo archivo filename.new
Puedes usar awk
:
awk '{print $0, FILENAME}' file1 file2 file3 ...