2017-05-12 3 views
0

Ich habe einen Text wie diesenPartition Text ohne feste Breite

blue chile    green morning dawn 
red turkey    pink morning dawn 
white south africa  red  evening midst & more 

Ich mag würde es so (man beachte die Rohrtrennzeichen)

blue child | green morning dawn 
red turkey | pink morning dawn 
white south africa | red evening midst & more 

Es gibt keine Breite so festgelegt aufzuspalten ich habe Probleme beim Partitionieren der Text

+0

Sie sehen feste Breite zu mir. Was lässt dich sagen, dass sie es nicht sind? –

+0

Ja, sie sind feste Breite! Nur realisiert – NinjaGaiden

Antwort

3

Dies könnte, was Sie suchen:

$ sed -E 's/ {3,}/ | /; s/ */ /g' file 
blue chile | green morning dawn 
red turkey | pink morning dawn 
white south africa | red evening midst & more 

Das obige setzt voraus, dass Ihre 2 "Felder" durch 3 oder mehr Leerzeichen getrennt sind, wie in Ihrer Posted-Eingabe. Es funktioniert in GNU oder OSX sed für -E, um EREs zu aktivieren.

Andernfalls, wenn die Felder wirklich Breite festgelegt sind, wie es in Ihrer geschriebenen Eingabe erscheint dann für eine verbesserte Robustheit mit GNU awk für FIELDWIDTHS betrachten:

$ awk -v FIELDWIDTHS='25 8 999' -v OFS=' | ' '{print $1, $2, $3}' file 
blue chile    | green | morning dawn 
red turkey    | pink  | morning dawn 
white south africa  | red  | evening midst & more 

$ awk -v FIELDWIDTHS='25 8 999' -v OFS=' | ' '{print $1, $2 $3}' file 
blue chile    | green morning dawn 
red turkey    | pink morning dawn 
white south africa  | red  evening midst & more 

$ awk -v FIELDWIDTHS='25 8 999' -v OFS=' | ' '{$0 = $1 OFS $2 $3; gsub(/ +/," ")} 1' file 
blue chile | green morning dawn 
red turkey | pink morning dawn 
white south africa | red evening midst & more 
+0

wusste nicht über FIELDWIDTHs. Also, ist es möglich, mit Spalte Nummer 25, 55 und 67 zu partitionieren? – NinjaGaiden

+0

Ja, was auch immer du magst ... siehe https://www.gnu.org/software/gawk/manual/gawk.html#Constant-Size. Mit anderen Awks würden Sie eine 'while() substr()' Schleife verwenden. –

+1

Danke für die substr und Feldbreiten Tipp – NinjaGaiden

1

wenn Sie Räume neben das Rohrtrennzeichen normalisieren wollen

$ sed -r 's/(.{25})/\1 | /' file | tr -s ' ' 

blue chile | green morning dawn 
red turkey | pink morning dawn 
white south africa | red evening midst & more 

dies entspricht Ihrer Ausgabe, aber beachten Sie, dass der zusätzliche Platz in red turkey auch entfernt wird. Wenn Sie es bewahren möchten, erfordert es zusätzliche Schritte.