Um comando unix para truncar cada linha de um arquivo

5

Eu tenho um arquivo CSV e quero truncá-lo a partir do terceiro ponto-e-vírgula. Por exemplo, se eu tiver este arquivo:

1;foo;bar;baz;x;y;z
2;foo;bar;baz;x;y;z
3;foo;bar;baz;x;y;z

Eu quero obter a seguinte saída:

1;foo;bar
2;foo;bar
3;foo;bar

Eu não sei que tipo de comando Unix eu posso usar para isso. O que você sugere?

Note que esta manipulação será feita em um script KSH.

    
por Romain Linsolas 13.11.2012 / 17:38

4 respostas

17

Por uma questão de variedade, eis outra maneira com cut :

cut -d \; -f -3
    
por 13.11.2012 / 17:49
6

Isso fará o que você perguntar:

awk -F';' '{print $1 ";" $2 ";" $3;}' <input >output

O utilitário awk está bem projetado para esta tarefa. Ele pode facilmente cortar linhas individuais em campos e manipulá-las com base nisso. O argumento -F';' informa awk para usar ; como o separador de campo. As aspas são necessárias porque o shell interpretaria ; como um separador de comando sem elas.

O comando dado ao awk para executar para cada linha (o '{print $1 ";" $2 ";" $3;}' bit) é similarmente cotado para manter todos os caracteres engraçados ( { , } , $ , " e ; em Neste caso) de ser tratado especialmente pelo shell e certifique-se que a coisa toda é passada para awk como uma unidade.

E, é claro, <input e >output são as diretivas de redirecionamento que estão sendo dadas ao shell para redirecionar a entrada e a saída do comando de e para um arquivo.

    
por 13.11.2012 / 17:40
3

Você pode fazer isso usando o awk, que não depende do shell. Você precisará gravar a saída em um arquivo temporário e depois movê-lo para o arquivo existente.

awk -F';' 'BEGIN { OFS=";" } { print $1,$2,$3 }' file.txt > newfile.txt
mv newfile.txt file.txt 
    
por 13.11.2012 / 17:41
1

Não é a melhor alternativa, caso você precise de uma edição no local e deseje resolvê-la com sed :

sed -i ':b;s/;[^;]*//3;tb' file.txt
    
por 13.11.2012 / 18:22