Puoi usare un loop di una riga come questo:
for f in file1 file2 file3; do sed -i "s/$/\t$f/" $f; done
Per ogni file nell'elenco, verrà utilizzato sed per aggiungere alla fine di ogni riga una tabulazione e il nome del file.
Spiegazione:
- Utilizzando il
-iflag consedper eseguire una sostituzione sul posto, sovrascrivendo il file - Esegui una sostituzione con
s/PATTERN/REPLACEMENT/. In questo esempio PATTERN è$, la fine della riga e REPLACEMENT è\t(=una TAB), e$fè il nome del file, dalla variabile del ciclo. Ils///command è racchiuso tra virgolette in modo che la shell possa espandere le variabili.
Andiamo perché voi ragazzi consigliate questi potenti strumenti quando c'è 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 piccolo trucco, potresti usare paste ai fini del PO. Tuttavia, non sostituirà i file inplace:
for f in file1 file2 file3; do
paste $f <(yes $f | head -n $(cat $f | wc -l)) > $f.new
done
Questo incollerà il rispettivo nome file come ultima colonna di ogni file nel nuovo file filename.new
Puoi usare awk :
awk '{print $0, FILENAME}' file1 file2 file3 ...