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
-imarcar consedpara 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$fes 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 ...