2016-11-09 7 views
0

ich diesen Wert haben, zerschnitt von .txt:Suchen und Ersetzen mit awk

,Request Id,dummy1,dummy2,dummyN 

ich finden bin versucht, und den Raum ersetzen mit „_“, wie folgt aus:

#iterator to read lines of txt 
#if conditions 
trim_line=$(echo "$user" | awk '{gsub(" ", "_", $0); print}') 
echo $trim_line 

aber die Echo zeigt:

Id,dummy1,dummy2,dummyN 

Erwartete Ausgabe:

Wo ist mein Fehler?

EDIT: Das Echo des Benutzers nicht der erwartet wird, ist es:

Id,dummy1,dummy2,dummyN 

Und sein sollte:

,Request Id,dummy1,dummy2,dummyN 

Um diese Operation zu tun, die ich benutze:

for user in $(cut -d: -f1 $FILENAME) 
do (....) find/replace 
+0

Was ist Ihre erwartete Ausgabe? – Inian

+0

', Request_Id, Dummy1, Dummy2, DummyN' –

+2

Sieht aus wie' $ user' nicht enthält, was Sie erwarten. –

Antwort

0

Ihr Problem ist die Verwendung einer for Schleife, um den Inhalt Ihrer Datei zu lesen. Die Shell teilt die Ausgabe Ihrer Befehlsersetzung $(cut -d: -f1 $FILENAME) auf Leerraum und Sie haben einen in der Mitte Ihrer Zeile, so dass es bricht.

eine while read Schleife Verwenden Sie die Datei Zeile für Zeile zu lesen:

while IFS=: read -r col junk; do 
    col=${col// /_} 
    # use $col here 
done < "$FILENAME" 

Wie andere erwähnt haben, gibt es keine Notwendigkeit, ein externes Tool, um die Substitution zu machen.

... Das heißt, wenn Sie nicht etwas anderes (z.andere Befehle) mit jeder Zeile ausgeführt wird, dann ist die beste Option awk zu verwenden:

awk -F: '{ gsub(/ /, "_", $1); print $1 }' "$FILENAME" 

Die Ausgabe dieses Befehls ist die erste Spalte Ihrer Eingabedatei, mit der Substitution.

+0

Sollte nicht der Feldtrenner sein, in beiden Beispielen? – Inian

+0

Die Idee war, die Verwendung von 'cut -d:' zu ersetzen. –

0

Wenn Ihre Daten bereits in einer Umgebung varia ble, ist der schnellste Weg, direkt integrierte Funktion bash Ersatz zu verwenden:

wird
echo "${user// /_/}" 

Mit awk, stellen Sie den Separator als , oder das Leerzeichen als Trennzeichen interpretiert werden.

echo ",Request Id,dummy1,dummy2,dummyN" | awk -F, '{gsub(" ", "_", $0); print}' 

,Request_Id,dummy1,dummy2,dummyN 

Anmerkung: wenn es nur ein Zeichen in einem rohen String (keine Token, keine Felder) zu ersetzen, bash, sed und tr am besten geeignet sind.

1

Sie können bash Suche versuchen und String ersetzen:

echo $user 
,Request Id,dummy1,dummy2,dummyN 
echo ${user// /_}     ## For all the spaces 
,Request_Id,dummy1,dummy2,dummyN 
echo ${user/ /_}     ## For first match 

Dieses alle Leerzeichen mit _ ersetzen wird. Beachten Sie, dass hier zwei / nach Benutzer verwendet werden. Dies dient dazu, den gesamten Text zu suchen und zu ersetzen. Wenn Sie nur eine / setzen, dann würde das Suchen und Ersetzen über die erste Übereinstimmung erfolgen.