erro no uso do awk / sed de manipulação de arquivos linha por linha [duplicado]

1

Eu tenho um requisito de anexar a string " 1" no final de cada linha do arquivo. Após a execução de dois comandos abaixo, é criado um arquivo vazio.

awk '{ print $0 " 1" }' < file.txt > file.txt 

usando sed

sed 's/$/ 1/' file.txt > file.txt

Qual é o erro aqui tentado? Por favor, avise? Estou executando esses comandos no mac terminal.

    
por Prradep 31.07.2015 / 14:19

1 resposta

3

A solução sed do GNU precisa de -i para edição in-line:

sed -i 's/$/ 1/' file.txt

(Com BSD sed , você precisa de sed -i '' )

Em awk , você precisa contornar isso com um arquivo temporário:

awk '{ print $0 " 1" }' file.txt > tmp && mv tmp file.txt

Na verdade, sed também cria um arquivo temporário, mas -i lida com isso

O problema com awk '{ print $0 " 1" }' < file.txt > file.txt :

Os redirecionamentos foram realizados antes de awk obter o controle. > file.txt truncará o arquivo. Tente em um terminal:

>file

O file será de tamanho zero, mesmo se antes o arquivo tivesse conteúdo. Portanto, awk não possui dados para ler desse arquivo. Esse é o mesmo problema que com sed .

Solução final com \r quebras de linha:

perl -pi -e 's/\r\n|\n|\r/ 1\n/g' file.txt
    
por 31.07.2015 / 14:22

Tags