awk entfernt unerwartet Punkte aus der Zeichenfolge


9

Ich möchte eine Spalte (2. Platz) in eine .csvDatei einfügen und möchte, dass die Werte dieser Spalte Zeichenfolgen sind und in Anführungszeichen gesetzt werden.

Der folgende Befehl fügt die Spalte hinzu, jedoch ohne Anführungszeichen:

awk -F"," 'BEGIN { OFS = "," } {$2="2.4.0"; print}' test.csv > output.csv

Der folgende Ansatz enthält zwar die Anführungszeichen, entfernt jedoch aus irgendeinem Grund den letzten .(Punkt) aus dem Wert

awk -F"," 'BEGIN { OFS = "," } {$2="\""2.4.0"\""; print}' test.csv > output.csv

Meine Werte sind also "2,40".

Wie soll ich das machen?


Wenn Ihre Datei 2 oder mehr Spalten enthält, möchten Sie die zweite Spalte einfügen oder ersetzen?
Ctac_


2
ok, also zum Einfügen müssen Sie verwenden: awk 'BEGIN {FS = OFS = ","} {$ 1 = $ 1 ", \" 2.4.0 \ "} 1'
ctac_

1
oder awk '{sub (",", "," 2.4.0 ",")} 1'
ctac_

Antworten:


12

Sie scheinen die Zitate falsch verstanden zu haben. Sie müssen wie folgt vorgehen

awk -F"," 'BEGIN { OFS = "," } {$2="\"2.4.0\""; print}' test.csv > output.csv

Dies wird in der Manpage zu GNU awk - 3.2 Escape Sequences erläutert

Einige Zeichen können nicht wörtlich in Zeichenfolgenkonstanten ("foo")oder Regexp-Konstanten ( /foo/) enthalten sein. Stattdessen sollten sie mit Escape-Sequenzen dargestellt werden, bei denen es sich um Zeichenfolgen handelt, die mit einem Backslash ( \) beginnen. Eine Verwendung einer Escape-Sequenz besteht darin, ein Zeichen in doppelten Anführungszeichen in eine Zeichenfolgenkonstante aufzunehmen. Da ein einfaches doppeltes Anführungszeichen die Zeichenfolge beendet, müssen Sie \"ein tatsächliches doppeltes Anführungszeichen als Teil der Zeichenfolge darstellen.


Soweit der Grund, warum ich den Grund für das Verhalten verstehen konnte, awkscheint er 2.4.0als numerisches Wort mit den zusätzlichen Anführungszeichen aus Ihrem OP interpretiert worden zu sein und beschließt, die Genauigkeit nach dem ersten Punkt zu verlieren.

dh

$2="\""2.4.0"\""

wird gerecht

$2=""2.4.0""

was awknicht mehr als String versteht. Sie können dieses Verhalten einfach reproduzieren

awk 'BEGIN { print ""2.4.0"" }'
2.40

was zufällig das Ergebnis ist, wenn Sie dies tun

awk 'BEGIN { print 2.4.0 + 0 }'

1
@roaima: Soweit ich weiß, scheint es gerade aufgehoben worden zu sein und nur zu { print 2.4.0 }oder { print 2.4.0 + 0 }, dh als Nicht-String-Bestandteil, geführt zu haben. Ich habe versucht, nach relevanten Dokumenten zu suchen, konnte es aber nicht
Inian

2
Eine andere Möglichkeit, Anführungszeichen, die ich manchmal verwende, bequem hinzuzufügen, besteht darin, eine Variable zu definieren, z. B.:awk -v q='"' '... print q "2.4.0" q ...
Thor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.