Ersetzen Sie "_" durch "|" in einer Datei nur im 5. Feld

Ersetzen Sie "_" durch "|" in einer Datei nur im 5. Feld

Meine Datei hat folgenden Inhalt:

rat|minty|ruhul|balaji|rat_123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1_123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2_123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Ich muss es _durch ersetzen |, aber nur im 5. Feld.

Erwartete Ausgabe:

rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Antwort1

Mit awkverwendengsub()im 5. Feld:

$ awk 'BEGIN{FS=OFS="|"} {gsub("_",FS,$5)}1' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Erläuterung

  • BEGIN{FS=OFS="|"}
    Setzen Sie den Feldtrenner auf |. Auf diese Weise können wir $5als 5. Feld ansprechen und so weiter.
  • {gsub("_",FS,$5)}
    Ersetzen Sie alle _im 5. Feld durch FS. Das heißt, durch |.
  • 1
    Standardaktion von awk auslösen: Den aktuellen (geänderten) Datensatz drucken.

Antwort2

Mit sedder Voraussetzung, dass das 5. Feld nur eines _ersetzt werden muss

$ sed -E 's/^(([^|]+\|){4}[^_]+)_/\1|/' ip.txt 
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Lösung mit perl(ähnlich wie awkeins), wenn alle _im 5. Feld ersetzt werden sollen:

$ perl -F'\|' -lane '$F[4] =~ tr/_/|/; print join "|",@F' ip.txt 
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Antwort3

Mit perl:

$ perl -F'\|' -ne '$F[4]=~s/_/|/; print join "|", @F' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Die -amacht perlwie awkund teilt jede Eingabezeile des durch gegebenen Zeichens -Fin im Array gespeicherte Felder auf @F. Dann ersetzen wir _durch |im 5. Feld (Arrays beginnen bei 0, ebenso $F[4]das 5. Feld) und drucken dann das durch verbundene Array |.

Sie können den Array-Separator auch auf „ |and print“ setzen "@F", was dasselbe, aber präziser bewirkt:

$ perl -F'\|' -ne '$"="|"; $F[4]=~s/_/|/; print "@F"' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Natürlich _ist in Ihrem konkreten Beispiel das im 5. Feld auch das erste in der Zeile, wenn Ihre Datei also tatsächlich so ist, reicht es aus, Folgendes zu tun:

$ perl -pe 's/_/|/' file 
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Oder

$ sed 's/_/|/' file 
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Sie können den gleichen Ansatz verwenden mit awk:

$ awk -F'|' 'sub("_","|")' file 
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Oder, um nur das 5. Feld anzugeben und alle Vorkommen von _im 5. Feld zu ersetzen, eine kürzere Version von@fedorquis Antwort:

$ awk -F'|' -vOFS='|' 'gsub("_","|",$5)' file 
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Beachten Sie, dass diese beiden awkLösungen nur Zeilen drucken, bei denen die Ersetzung erfolgreich war. Wenn Sie Zeilen haben können, die nicht dem Muster entsprechen (Nein _im 5. Feld), verwenden Sie stattdessen den Ansatz von @fedorqui oder einen der Perl-Ansätze.

verwandte Informationen