Por uma questão de variedade, eis outra maneira com cut
:
cut -d \; -f -3
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.
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.
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
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
Tags text-processing csv ksh