Classifique as palavras em cada linha, editando o arquivo no local

Classifique as palavras em cada linha, editando o arquivo no local

Eu leio um arquivo linha por linha e edito cada linha e salvo essas linhas em um arquivo separado.

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

Mas quero substituir as linhas originais pelas $filenamenovas linhas. Eu li que poderia usar cat filename... | xargs -n1 commandou sed -i ..., mas até agora minhas trilhas falharam.

Aqui está um exemplo de entrada:

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

e esta é a saída esperada:

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

Responder1

Você poderia usar sponge, como mencionado emUm programa que pode armazenar em buffer stdin ou arquivo. Você pode canalizar todo o loop para ele, da mesma forma que a entrada é redirecionada para ele:

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

Com Perl, o mesmo poderia ser feito com isto (a quantidade de espaços em branco é diferente):

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

Responder2

estranhoabordagem:

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

A saída:

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

IGNORAR CASOpode ser definido na linha de comando ou em umCOMEÇARregra

split($0, w, " ");- divide a linha em palavras separadas

asort(w);- classifica os valores do array (palavras)

for(i in w) {l=l" "w[i]}- concatenar palavras classificadas em uma única linha

informação relacionada