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
-i
mitsed
kennzeichnen 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$f
ist 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 ...