Sie können eine Einzeiler-Schleife wie diese verwenden:
for f in file1 file2 file3; do sed -i "s/$/\t$f/" $f; done
Für jede Datei in der Liste wird sed verwendet am Ende jeder Zeile einen Tabulator und den Dateinamen anzuhängen.
Erklärung:
- Mit dem
-imitsedkennzeichnen um eine Ersetzung an Ort und Stelle durchzuführen und die Datei zu überschreiben - Führen Sie eine Ersetzung mit
s/PATTERN/REPLACEMENT/durch . In diesem Beispiel ist PATTERN$, das Ende der Zeile, und REPLACEMENT ist\t(=ein TAB) und$fist der Dateiname aus der Schleifenvariablen. Dies///Der Befehl steht in doppelten Anführungszeichen, damit die Shell Variablen erweitern kann.
Komm schon, warum empfiehlt ihr diese leistungsstarken Tools, wenn es paste gibt Befehl!
$ cat a
A
B
C
D
$ cat b
1
2
3
4
$ paste a b
A 1
B 2
C 3
D 4
Mit ein wenig Trickserei könnten Sie paste verwenden für den Zweck des OP. Es ersetzt jedoch nicht die vorhandenen Dateien:
for f in file1 file2 file3; do
paste $f <(yes $f | head -n $(cat $f | wc -l)) > $f.new
done
Dadurch wird der jeweilige Dateiname als letzte Spalte jeder Datei in die neue Datei filename.new eingefügt
Sie können awk verwenden :
awk '{print $0, FILENAME}' file1 file2 file3 ...