Wie fügt man einer Datei Spalten hinzu (vorzugsweise mit sed -i), wenn nur eine Spalte vorhanden ist?

Wie fügt man einer Datei Spalten hinzu (vorzugsweise mit sed -i), wenn nur eine Spalte vorhanden ist?

Angenommen, ich habe eine Datenspalte wie diese:

sample123
sample456
samplexyz

Ich kann ganz einfach zwei neue Spalten hinzufügen, indem ich Folgendes verwende:

sed -i "s/$/\t1.1\tC/" <file.txt>

Jetzt ist es:

sample123   1.1 C
sample456   1.1 C
samplexyz   1.1 C

Nehmen wir nun an, ich füge unten einige neue Daten an:

sample123   1.1 C
sample456   1.1 C
samplexyz   1.1 C
sampleNew1
sampleNew2
sampleNew3

Wenn ich versuche, die neuen Spalten für diese Daten anzuhängen, werden sie an alle Zeilen angehängt. Wenn ich jetzt also Folgendes ausführe:

sed -i "s/$/\t1.2\tA/" <file.txt>

Es sieht aus wie:

sample123   1.1 C   1.2 A
sample456   1.1 C   1.2 A
samplexyz   1.1 C   1.2 A
sampleNew1  1.2 A
sampleNew2  1.2 A
sampleNew3  1.2 A

Wie füge ich die Spalten hinzu, in denen außer der ersten keine anderen Spalten vorhanden sind?

Antwort1

Testen Sie zunächst, ob die aktuelle Zeile ein Tabulatorzeichen enthält oder nicht, und führen Sie die Ersetzung nur durch, wenn dies nicht der Fall ist:

sed -i '/\t/!s/$/\t1.2\tA/' file

Hier adressieren wir alle Zeilen, die kein Tabulatorzeichen enthalten, /\t/!und wenden die Ersetzung auf diese Zeilen an.

Das Obige setzt voraus, dass GNU in der Lage ist , als Tabulatorzeichen sedzu erkennen . Andere Implementierungen müssen möglicherweise anstelle von ein wörtliches Tabulatorzeichen verwenden . Andere Implementierungen handhaben die Option möglicherweise auch anders als GNU (siehe „\tsed\tsed-isedWie kann ich mit sed -i (In-Place-Bearbeitung) Portabilität erreichen?").


Verwendung von awk:

awk -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file

Dadurch wird die Anzahl der durch Tabulatoren getrennten Felder getestet. Wenn nur ein einziges Feld vorhanden ist, wird vor dem Drucken der Zeile ein neues zweites und drittes Feld hinzugefügt.

Dadurch wird die Datei nicht direkt geändert. Verwenden Sie dazu GNU awkwie folgt:

awk -i inplace -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file

Weitere Informationen zu awkund zu Bearbeitungen vor Ort finden Sie unter "Wie kann ich eine Datei mit awk dauerhaft ändern? („In-Place“-Änderungen, wie mit „sed -i“)".

verwandte Informationen