2016-04-15 11 views
0

einen Schlüsselwert wiederholen Ich habe den Schlüssel-Wert nach jeweils 14 Zeichen in einer ZeileWie für jede Spalte in einer festen Länge Datei

Meine Datei wie folgt wiederholen aussieht:

KEYVALUE1 201604141111I201604141111C201604141111D201604141111E201604141111F 
KEYVALUE1 201604141111G 
KEYVALUE2 201604141111I201604141111C201604141111D201604141111E201604141111F 
KEYVALUE2 201604141111G201604141111F 
KEYVALUE3 201604141111I 
KEYVALUE4 201604141111G201604141111I 

Mein Ausgang sollte so aussehen,

KEYVALUE1 201604141111I 
KEYVALUE1 201604141111C 
KEYVALUE1 201604141111D 
KEYVALUE1 201604141111F 
KEYVALUE1 201604141111G 
KEYVALUE2 201604141111I 
KEYVALUE2 201604141111C 
KEYVALUE2 201604141111D 
KEYVALUE2 201604141111F 
KEYVALUE2 201604141111G 
KEYVALUE2 201604141111F 
KEYVALUE3 201604141111I 
KEYVALUE4 201604141111G 
KEYVALUE4 201604141111I 

Bitte helfen.

Antwort

1

sed ist für einfache Substitutionen an einzelnen Linien, das ist alles. Für alles andere sollte man awk aus Gründen der Einfachheit, Klarheit, Robustheit, Portabilität, Effizienz und die meisten anderen wünschenswerten Eigenschaften von Software werden:

$ awk '{ while ($2!="") { print $1, substr($2,1,13); $2=substr($2,14) } }' file 
KEYVALUE1 201604141111I 
KEYVALUE1 201604141111C 
KEYVALUE1 201604141111D 
KEYVALUE1 201604141111E 
KEYVALUE1 201604141111F 
KEYVALUE1 201604141111G 
KEYVALUE2 201604141111I 
KEYVALUE2 201604141111C 
KEYVALUE2 201604141111D 
KEYVALUE2 201604141111E 
KEYVALUE2 201604141111F 
KEYVALUE2 201604141111G 
KEYVALUE2 201604141111F 
KEYVALUE3 201604141111I 
KEYVALUE4 201604141111G 
KEYVALUE4 201604141111I 
+1

Danke ED .. Das funktioniert wie ein Juwel:) Ich habe gerade einen kleinen Schnitt mit den Positionen gemacht. seine 14 Zeichen anstelle von 13. Veröffentlichen Sie die Änderung, wie mein Befehl aussieht: awk '{while ($ 2! = "") {print $ 1, substr ($ 2,1,14); $ 2 = substr ($ 2,15)}} '$ FILE_NAME> BREAK_FILE – Mahesh

0

Sie können versuchen, diese sed:

sed -n '/^\([^ ]* \)\(.\{13\}\)/{s/^\([^ ]* \)\(.\{13\}\)/&\n\1/g;P;D;}' file 
+0

Dies funktioniert gut, Aber wenn ich Daten wie KEYVALUE2 201604141111G201604141111F habe, dann bekomme ich Zeilen mit nur keyvalue und Leerzeichen, die nicht beabsichtigt sind. Aber immer noch eine gute Alternative :) Ich bin auch ein SED FAN :) – Mahesh

0

Oder diese:

sed '{ 
    :j 
    /^[^ ]* .\{13\}.\{13\}/ { 
    h 
    s/^\([^ ]*\) \(.\{13\}\)\(.*\)$/\1 \2/ 
    p 
    x 
    s/^\([^ ]*\) \(.\{13\}\)\(.*\)$/\1 \3/ 
    h 
    b j 
    } 
}' file 
1

Wenn Sie sind offen für Perl:

perl -lane 'print "$F[0] $_" for $F[1] =~/.{13}/g' file 
Verwandte Themen