Wie kann ich einer Datei mit einer bestimmten Anzahl von Zeilen eine Spalte mit Werten hinzufügen? Ich habe eine Eingabedatei wie diese:
Eingabedatei:
SPATA17 1 217947738
LYPLAL1 1 219383905
FAM47E 4 77192838
SHROOM3 4 77660162
SHROOM3 4 77660731
SHROOM3 4 77662248
Ausgabedatei:
SPATA17 1 217947738 file1
LYPLAL1 1 219383905 file1
FAM47E 4 77192838 file1
SHROOM3 4 77660162 file1
SHROOM3 4 77660731 file1
SHROOM3 4 77662248 file1
In diesem Fall möchte ich eine Spalte mit Werten bis zur Anzahl der Zeilen in der Datei hinzufügen. Der Wert bleibt konsistent, z. B. "file1".
Der Grund ist, dass ich 100 dieser Dateien habe. Ich möchte nicht jede Datei öffnen und eine Spalte einfügen. Es gibt auch eine Möglichkeit, dies zu automatisieren, indem Sie in ein Verzeichnis gehen und eine Spalte mit Werten hinzufügen. Der Wert stammt aus dem Dateinamen, der in jeder Zeile der Datei in der letzten / ersten Spalte hinzugefügt werden muss.
quelle
sed
eignet sich am besten zum Ersetzen und Speichern von Mustern. Für Ihre Anforderung, die Datei zu speichern, war dies eine relativ bequeme Option. Wenn Sie nicht in dieselbe Datei zurückschreiben müssen, die Sie gerade bearbeiten,awk
ist die Arbeit mit dieser Datei in der Regel viel einfacher.awk
zu oft über die Eingabe- / Ausgabefeldtrennzeichen und versuche daher, sie möglichst nicht zu verwenden, umsed
sie attraktiver zu machen.Komm schon, warum ihr diese mächtigen Werkzeuge empfiehlt, wenn es
paste
Befehl gibt!Mit ein wenig Trick könnten Sie
paste
für den Zweck des OP verwenden. Die vorhandenen Dateien werden jedoch nicht ersetzt:Dadurch wird der jeweilige Dateiname als letzte Spalte jeder Datei in eine neue Datei eingefügt
filename.new
quelle
paste
ist sicherlich ein verstecktes Juwel.Sie können verwenden
awk
:quelle
FILENAME
ist eine Variable inawk
, wird auf den aktuellen Dateinamen erweitert, derawk
gerade verarbeitet wird. Du machst es einfach einmal, füttere alle Dateien anawk
.GNU awk 4.1.0
oder später, können Sie verwenden-i
, um an Ort und Stelle zu bearbeiten. Andernfalls sollten Sie dieawk
Ausgabe in eine temporäre Datei umleiten und danngrep
zum Extrahieren der Zeilen aus den einzelnen Dateien verwenden.for file in *; do awk 'BEGIN{OFS="\t"}{print $0, FILENAME}' $file; done