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
-i
flag consed
per 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 ...