Sortieren Sie Wörter in jeder Zeile und bearbeiten Sie die Datei direkt

Sortieren Sie Wörter in jeder Zeile und bearbeiten Sie die Datei direkt

Ich lese eine Datei Zeile für Zeile, bearbeite jede Zeile und speichere diese Zeilen in einer separaten Datei.

while read -r line
do
   newline=$(echo $line | sed -r 's/\</\n/g' | sort | tr '\n' ' ')
   echo "$newline" >> newfile
done < "$filename"

Ich möchte jedoch die Originalzeilen durch die neuen Zeilen ersetzen . Ich habe gelesen, dass ich oder $filenameverwenden könnte, aber bisher sind meine Versuche fehlgeschlagen.cat filename... | xargs -n1 commandsed -i ...

Hier ist eine Beispieleingabe:

1.e4 e5 2.Nf3 Nc6 3.
1.d4 d5 2.e4 dxe4 3.
1.e4 e5 2.Nf3 Nf6 3.

und dies ist die erwartete Ausgabe:

 1. 2. 3. e4  e5  Nc6  Nf3  
 1. 2. 3. d4  d5  dxe4  e4  
 1. 2. 3. e4  e5  Nf3  Nf6 

Antwort1

Sie können sponge, wie inEin Programm, das die Standardeingabe oder eine Datei puffern könnteSie können die gesamte Schleife dorthin weiterleiten, genauso wie die Eingabe dorthin umgeleitet wird:

while read -r line ; do 
    echo "$line" | sed -r 's/\</\n/g' | sort | tr '\n' ' ' ; 
    echo
done < filename | sponge filename

Mit Perl könnte man das Gleiche hiermit machen (die Menge der Leerzeichen ist anders):

perl -Mlocale -i -lne 'print join " ", sort split/(?<=\.)| /' filename

Antwort2

awkAnsatz:

awk 'BEGIN{IGNORECASE=1;}{ gsub(/\./,". ", $0); split($0, w, " "); 
     asort(w);l=""; for(i in w) {l=l" "w[i]} print l}' file

Die Ausgabe:

1. 2. 3. e4 e5 Nc6 Nf3
1. 2. 3. d4 d5 dxe4 e4
1. 2. 3. e4 e5 Nf3 Nf6

FALL IGNORIERENkann auf der Kommandozeile oder in einemBEGINNENRegel

split($0, w, " ");- teilt die Zeile in einzelne Wörter auf

asort(w);- sortiert Array-Werte (Wörter)

for(i in w) {l=l" "w[i]}- Verketten sortierter Wörter zu einer einzigen Zeile

verwandte Informationen