2016-06-03 14 views
1

Ich habe eine Anforderung, wo die Datensätze in einer Datei sind "|" Rohr begrenzt. Feld 4 bis Feld 20 haben jeweils 20 Zeichen. Diese Felder können führende und nachfolgende Leerzeichen enthalten, oder das gesamte Feld kann nur Leerzeichen enthalten. Ich möchte den Platz am Anfang und am Ende des Rohrsymbols für Feld 4 nur in Feld 20 ersetzen.wie die Räume mit ~ zwischen bestimmten Positionen in jeder Zeile einer Datei ersetzen

Wie kann ich es tun?

Beispielprotokoll:

XXXX|XXXX| XXXXXX|05.00000% 02/01/2030|OXXXXXXX, TEST |XXXXXXW  |     |     |     |     |     |     |     |     |     |     |     |     |ORG |0001-01-01|10|14|XXX|2016-05-01|   | |2016-10-14|0001-01-01|2030-02-01|2014-01-01|Y|2|000|1|I|   | | |N|SA   |N|2016-05-26|A|US|2016-05-01| |Y|N|08 |SDBM1  |Y|Y| |N| |N|N| | | | | |R|   |   |N|   |   |0000000000000000.00|   |0000000000000000.0000|   |   |2|XXXXX|2014-10-06|AA |2016-05-11|  |0001-01-01|  |0001-01-01|05.00000|2016-05-11|                                      |C   |2010-09-10|0001-01-01|XXXX|  |2011-06-09|  |2011-06-09|2026-02-01|0000000100.000000000|P|   |0000000000.000000000| 

ERWARTETES ERGEBNIS:

....something.. |~ MAhesh ~|~MAHESH KMR|MKR ~|.. till 20th field 

Hinweis passiert die ersetzen sollte nur, wenn es einen Raum, in dem Anfang und Ende sonst darf es nicht ersetzen.

Antwort

0
awk -F"|" 'BEGIN{OFS="|"}{for(i=4;i<=20;i++){$i = match($i,/^[[:space:]]/)? "~"substr($i,2): $i; $i = match($i,/[[:space:]]$/)? substr($i,1,19)"~":$i}} 1' < file 

zur besseren Lesbarkeit

überprüfen, ob der Raum abgelegt hat am Anfang und Ende, dann ersetzen entsprechend

awk -F"|" ' 
BEGIN{OFS="|"} 
{ 
for(i=4;i<=20;i++){ 
    $i = match($i,/^[[:space:]]/) ? "~"substr($i,2): $i; 
    $i = match($i,/[[:space:]]$/) ? substr($i,1,19)"~":$i 
} 
} 1 
' < file 
+0

ehrfürchtig. Funktioniert wie ein Juwel. Danke, das war die erforderliche Lösung :) –