Ich habe eine Datendatei, die ich mit regulären Ausdrücken transformieren muss. Genauer gesagt muss ich die ersten 6 Spalten gleich beibehalten und ab der 7. Spalte nur die ungeraden Spalten auswählen und dann die Felder jedes Paars aufeinanderfolgender Zeilen zusammensetzen. Ich weiß, es klingt ein bisschen kompliziert, also werde ich das an einem Beispiel verdeutlichen. Dieses ist meine ursprüngliche Datendatei (es könnte eine beliebige Anzahl von Spalten):Wählen Sie ungerade Spalten, dann Felder aufeinanderfolgender Zeilen zusammen
A B C D E F 11 12 13 14 15 16 17 18
A B C D E F 21 22 23 24 25 26 27 28
A B C D E F 31 31 33 34 35 36 37 38
A B C D E F 41 42 43 44 45 46 47 48
A B C D E F 51 52 53 54 55 56 57 58
A B C D E F 61 62 63 64 65 66 67 68
A B C D E F 71 72 73 74 75 76 77 78
A B C D E F 81 82 83 84 85 86 87 88
ich ich herausgefunden, die ersten 6 Spalten halten und dann mit
awk '{for (i = 1; i <= NF; i++) if (i < 7 || i % 2 == 1) printf $i OFS}; {print ""}
ist dies die die ungeraden löschen Ergebnis:
A B C D E F 11 13 15 17
A B C D E F 21 23 25 27
A B C D E F 31 33 35 37
A B C D E F 41 43 45 47
A B C D E F 51 53 55 57
A B C D E F 61 63 65 67
A B C D E F 71 73 75 77
A B C D E F 81 83 85 87
Aber danach muss ich die Felder jedes Paar von aufeinanderfolgenden Reihen zusammen, wie folgt aus:
Ich dachte an sed oder awk, um den ganzen Prozess zu machen, da meine Datendateien riesig sind und ich sie effizient transformieren muss, aber ich konnte auch keinen Weg finden, die zweite Transformation durchzuführen. Jede Hilfe würde sehr geschätzt werden.
Ich schätze deine Antwort sehr, genau das habe ich gesucht. Ich werde sowohl Ihre Lösung als auch die, die ich gerade erfunden habe, ausprobieren, um zu testen, welche schneller ist (obwohl auf den ersten Blick Ihre besser ist). – Serchu
@Serchu: Ich habe meine Antwort bearbeitet. Ich habe es etwas allgemeiner (und etwas kryptischer) gemacht. Es behandelt jetzt Dateien mit einer geraden Anzahl von Spalten oder einer ungeraden Anzahl von Spalten. Sie können sogar die Anzahl der Anfangsspalten festlegen, die beibehalten werden sollen. HTH. – Steve
Ich verstehe die Versuchung, getline hier zu verwenden, aber es ist fast immer am besten, es zu vermeiden, da es einfache Anforderungsänderungen schwer zu implementieren macht (unter vielen anderen Vorbehalten - siehe http://awk.info/?tip/getline). Was, wenn Sie beispielsweise zusätzlich alle Zeilen mit 45 zählen möchten? Mit einer non-getline-Lösung würden Sie einfach "/ 45/{C++}" zur awk body hinzufügen, aber mit einer getline-Lösung müssen Sie das tun und "if (line ~/45 /) {C++}" nach der getline, komplizieren Dinge und erstellen doppelten Code für nur eine kleine, konzeptionell triviale Anforderungsänderung. –