Lote ordenando vários arquivos e removendo linhas duplicadas de vários arquivos - no lugar, se possível

1

Eu tenho uma pasta contendo vários arquivos de texto.

apple.txt, book.txt, dentes.txt etc.

Eu criei um script bash com vários comandos sed para processar todos os arquivos de texto da seguinte forma:

    ...
    find /directory/. -type f -exec sed -i 's/one/two/g' {} \;
    ...

Essas linhas funcionam bem.

Existe uma maneira de processar todos os arquivos de texto individuais no lugar de maneira similar (comando único) para executar estas operações:

  1. classifica as linhas da cadeia mais longa para a mais curta (cada linha contém uma string - sem espaços).

  2. remova todas as linhas duplicadas.

por speld_rwong 14.01.2017 / 23:56

1 resposta

0

Não sei qual é o requisito para um único comando, mas isso chega bem perto:

(cd /directory/; find -type f -printf '%P
(cd /directory/; find -type f -printf '%P%pre%' | while IFS= read -r -d '' fn; do
    awk '{ print length, $0 }' "$fn" | sort -nur | sed -r 's/^[0-9]+ //' > "$fn.~"
    mv "$fn.~" "$fn"
done)
' | while IFS= read -r -d '' fn; do awk '{ print length, $0 }' "$fn" | sort -nur | sed -r 's/^[0-9]+ //' > "$fn.~" mv "$fn.~" "$fn" done)

A primeira linha simplesmente lê os nomes dos arquivos da forma mais robusta possível.

A segunda linha é onde todo o trabalho acontece:

  • o awk adiciona uma contagem de caracteres (+ espaço) ao início de cada linha
  • sort -n (numérico), -u (exclusivo) e -r (reverso) processam o arquivo
  • sed remove a contagem de caracteres iniciais
  • então é despejado em um arquivo temporário

A linha mv grava o arquivo temporário sobre o original (como não pode ser feito durante o pipeline).

    
por 15.01.2017 / 08:05