it-swarm.com.de

Hinzufügen einer Wertespalte in einer durch Tabulatoren getrennten Datei

Wie kann ich einer Spalte mit einer bestimmten Anzahl von Zeilen eine Wertespalte 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 Wertespalte bis zur Anzahl der Zeilen in der Datei hinzufügen. Der Wert bleibt konsistent, z. B. "Datei1".

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 Wertespalte hinzufügen. Der Wert stammt aus dem Dateinamen, der in jeder Zeile der Datei in der letzten/ersten Spalte hinzugefügt werden muss.

18
Ron

Sie können eine Einzeiler-Schleife wie folgt 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, um am Ende jeder Zeile eine Registerkarte und den Dateinamen anzuhängen.

Erläuterung:

  • Verwenden Sie das Flag -i Mit sed, um einen direkten Austausch durchzuführen und die Datei zu überschreiben
  • Führen Sie eine Ersetzung mit s/PATTERN/REPLACEMENT/ Durch. In diesem Beispiel ist PATTERN $, Das Zeilenende, und REPLACEMENT ist \t (= Eine TAB), und $f Ist der Dateiname aus der Schleifenvariablen. Der Befehl s/// Steht in doppelten Anführungszeichen, damit die Shell Variablen erweitern kann.
23
janos

Komm schon, warum ihr diese leistungsstarken Tools empfiehlt, wenn es den Befehl paste gibt!

$ 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 Trick könnten Sie paste für den Zweck des OP verwenden. Die vorhandenen Dateien werden jedoch nicht ersetzt:

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 eine neue Datei eingefügt filename.new

12
yegle

Sie können awk verwenden:

awk '{print $0, FILENAME}' file1 file2 file3 ...
11
cuonglm