2017-06-02 5 views
0

Ich möchte column2 bis column4 verketten. Beispiel (first.txt):CONCAT Spalten innerhalb einer Datei

|ID|column2|column3|column4| 
|1 | a | b | c | 
|2 | d | e | f | 

Zu diesem (mynewfile.txt):

ID|column2 
1 | a b c 
2 | d e f 

Das ist mein Skript in Cygwin: $ awk '{print $2" "$3" "$4 }' first.txt > mynewfile.txt

Natürlich funktioniert es nicht aus gut .. Wie verbessere ich das Skript?

+1

'awk' verwendet Leerzeichen als Standardfeld deliimter. Sie müssen die Option "-F" verwenden, um die Pipe als Trennzeichen zu verwenden. – Barmar

Antwort

1

Sie müssen das Feldtrennzeichen so festlegen, dass eine Pipe mit optionalem Leerzeichen um das Feldtrennzeichen steht.

Die Pipe am Anfang der Zeile verursacht ein leeres Feld 1 vor der Pipe, also die ID ist Feld 2 und die Spalten 2-4 sind Felder 3-5. So sollte es sein:

awk -F' *\\| *' 'NR == 1 {print "ID|column2|"} NR > 1 {printf("%d | %s %s %s |\n", $2, $3, $4, $5)}' first.txt > mynewfile.txt 
+0

Die ID-Spalte ging verloren – user6308605

+0

es funktioniert für mich auf OS X. Ich habe Cygwin nicht, aber ich sehe nicht, warum es anders sein würde. – Barmar

+0

Die 'column2' ist jetzt in der' ID' Spalte. es sollte zusammen mit dem Rest zusammengefügt werden – user6308605

0

Nicht besonders allgemeine GNUsed Methode:

sed 's/^[|]//;1s/2.*/2/;1!{s/|/ /g2;s/ */ /2g}' first.txt 

Ausgang:

ID|column2 
1 | a b c 
2 | d e f 
Verwandte Themen