Neuformatierung negativer Zahlen mit sed oder awk

Neuformatierung negativer Zahlen mit sed oder awk

Ich habe eine Textdatei, die einige negative Zahlen enthält, allerdings sind sie wie folgt formatiert:

00000012-

Mit dem Bindestrich nach der Nummer.

Ich verarbeite die Datei mit awk, um sie in SQL-Einfügebefehle umzuformatieren, und der SQL-Interpreter verschluckt sich an der Zahl, weil nach der Zahl ein Minuszeichen erscheint.

Gibt es einen regulären Ausdruck, der das Minuszeichen vor die Zahl verschieben kann?

Antwort1

Mit sed:

echo 00000012- |  sed -e 's/\([0-9]+\)\(-\)\?/\2\1/'

gibt -00000012.

Das heißt, zwei Gruppen werden abgeglichen, die erste mit Ziffern und die zweite mit einem Vorzeichen, wobei jedoch null oder mehr Übereinstimmungen vonDas, und dann werden die beiden vertauscht.

Antwort2

Verlassen Sie sich stattdessen auf SQL, um das Problem zu beheben:

create table #Tempt (Value VarChar(100))

Insert Into #Tempt Values(NULL)
Insert Into #Tempt Values('500.1-')
Insert Into #Tempt Values('-500.1')
Insert Into #Tempt Values('20.5')


select *, case when Value like '%-' then '-' + replace(value,'-',') else value end
 From   #Tempt

Verwenden Sie dann die Masseneinfügung, um die Werte in #TemptIhre tatsächliche Tabelle zu ziehen.


Genommen vonMasseneinfügung negativer Werte.

Warum erwarten die Leute immer von Programmierern, dass sie solchen Blödsinn beseitigen?

Du bist nicht der Einzige ...

Antwort3

Mit sed:

sed -e 's/\<\([0-9.]\+\)-/-\1/g'

oder

sed -E -e 's/\<([0-9+]+)-/-\1/g'

Mit GNU awk:

awk '{$0=gensub(/\<([0-9.]+)-/,"-\\1","g"); print }'

HINWEIS: Erfordert GNU awk für gensub()die Funktion. Weder sub()noch gsub()unterstützen Capture-Gruppen.

Mit Perl:

perl -p -e 's/\b([\d.]+)-/-$1/g'

verwandte Informationen