2016-11-20 3 views
-1

Ich habe eine einzige Textdatei. Diese Datei hat 5 Zeilen und 5 Spalten. Alle Spalten sind durch "|" (Symbol). In dieser zweiten Spalte (Inhalt) sollte die Länge 7 Zeichen betragen.Unix Shell Scripting - Wie kann ich bestimmte Zeichen in einer Textdatei entfernen?

Wenn die zweite Spaltenlänge mehr als 7 Zeichen beträgt. Dann möchte ich diese zusätzlichen Zeichen entfernen, ohne diese Datei zu öffnen.

Zum Beispiel:

cat file1 

ff | hahaha1 | kjbsb | 122344 | jbjbnjuinnv |

df | hadb123_udcvb | sbfuisdbvdkh | 122344 | jbjbnjuinnv |

gf | harayhe_jnbsnjv | sdbvdkh | 12234 | jbjbnj |

qq | kkkks2 | datetag | 7777 | jbjbnj |

jj | harisha | hagte | 090900 | hags |

Für den obigen Fall sind die zweite und dritte Zeile mit der zweiten Spaltenlänge mehr als 7 Zeichen. Jetzt möchte ich diese zusätzlichen Zeichen entfernen, ohne die Eingabedatei mit dem Befehl awk oder sed zu öffnen

Ich warte auf Ihre Antworten Jungs.

Vielen Dank im Voraus!

+0

siehe https://stackoverflow.com/editing-help, besser die erwartete Ausgabe zur besseren Übersicht hinzufügen und https://stackoverflow.com/help – Sundeep

+2

Sie können eine Datei nicht bearbeiten, ohne sie zu öffnen. –

+1

Es ist nicht klar, was genau Ihre "ohne die Datei öffnen" -Anforderung bedeutet. Um die Eingabedatei zu lesen, muss die Datei _must_ geöffnet sein.Wenn Sie die Eingabedatei einfach nicht überschreiben möchten, können Sie stattdessen in eine temporäre Datei schreiben (wie in @ TomFenechs Antwort unten). – e0k

Antwort

2

Nehmen Sie eine Teillänge 7 aus der zweiten Spalte mit awk:

awk -F'|' -v OFS='|' '{ $2 = substr($2, 1, 7) }1' file 

nun alle Saiten länger als 7 Zeichen kürzer gemacht werden. Alle kürzeren Strings bleiben unverändert.

1 Die am Ende der kürzeste wahre Zustand die Standardaktion auszulösen, { print }.

Wenn Sie mit den Änderungen zufrieden sind, dann können Sie die Original-Datei wie folgt überschrieben:

awk -F'|' -v OFS='|' '{ $2 = substr($2, 1, 7) }1' file > tmp && mv tmp file 

das heißt in eine temporäre Datei umleiten und dann das Original überschreiben.

0

Erster Versuch

sed 's/\(^[^|]*|[^|]\{7\}\)[^|]*/\1/' file1 

Was hier geschieht? Wir bauen den Befehl Schritt-für-Schritt:

# Replace something 
sed 's/hadb123_udcvb/replaced/' file1 
# Remember the matched string (will be used in a later command) 
sed 's/\(hadb123_udcvb\)/replaced/' file1 
# Replace a most 7 characters without a '|' (one time each line) 
sed 's/\([^|]\{7\}\)/replaced/' file1 
# Remove additional character until a '|' 
sed 's/\([^|]\{7\}\)[^|]*/replaced/' file1 
# Put back the string you remembered 
sed 's/\([^|]\{7\}\)[^|]*/\1/' file1 
# Extend teh matched string with Start-of-line (^), any-length first field, '|' 
sed 's/\(^[^|]*|[^|]\{7\}\)[^|]*/\1/' file1 

Wenn dies die gewünschte Ausgabe zeigt, können Sie die Option hinzufügen -i zum Ändern der Eingabedatei:

sed -i 's/\(^[^|]*|[^|]\{7\}\)[^|]*/\1/' file1 
Verwandte Themen