2010-12-10 13 views
0

Ich habe eine Datei mit mehreren Datensätzen und jedem Datensatz der Länge 100. In jeder Zeile gibt es ein Segment der Länge 50 Zeichen (25-75), die für State reserviert ist, Land. Jetzt brauche ich aber das Segment als Staat, Land (Abstand zwischen und Land entfernen) und gleichzeitig die Länge des Feldes als 50 beibehalten.UNIX-Skript - Verschieben eines Zeichens in jeder Zeile einer Datei

Verwenden des Perl-Befehls perl -pi -e 's /,/,/g '* .txt Ich konnte den Platz entfernen, aber das reduziert die Länge des Segments auf 49. Gibt es eine Möglichkeit, den Platz zu entfernen und auch die Länge des Segments beizubehalten und dies auch für alle zu tun die Datensätze in der Datei?

+0

Wie können Sie ein Zeichen entfernen und erwarten, dass die resultierende Zeichenfolge die gleiche Länge hat? –

+0

Nun ist die Idee, den zusätzlichen Platz am Ende des Landes hinzuzufügen. – Jai

Antwort

0

Warum verwenden Sie Perl, wenn Sie sed verwenden können? Versuchen:

sed 's/,\(\s*\)\([^,]*\)/,\2\1/g' 

, dass jedes Leerzeichen zwischen einem Komma bewegt und eine Last von nicht-Komma (Text), um stattdessen nach dem Text zu sein.

a, b, c 

a,b ,c 

wird (mit einem Leerzeichen nach dem c)

0

Klingt wie wir das Zählen tun müssen - das ist der Brute-Force-Weg:

s/^(.{24})([^,]+)(+)(.{,49})(.{25})$/$1$2$4$3$5/; 

Dies entspricht den Charakterpositionen 1-24 in $ 1; der Zustandsteil bis zum ersten Komma in $ 2, eine Zeichenkette aus einem oder mehreren Leerzeichen wie $ 3, das Land als $ 4 und Zeichenpositionen 76-100 in $ 5.

Der Ersatz verschiebt die Lücken nach dem Land und behält so die Länge wie gewünscht bei.

Was Sie bekommen, wenn Ihre Aufzeichnungen nicht 100 Zeichen sind ... naja, wahrscheinlich nicht das, was Sie beabsichtigt haben. Sie können die Dinge sehr viel optimieren, aber (selbst wenn es sich um nicht getesteten Code handelt), besteht die Möglichkeit, dass dies ausreichend ist oder Sie die Idee haben, die Sie brauchen.

Verwandte Themen