Para obter os campos de que você precisa com awk
:
awk -F, '{for (i=1 ;i<NF;i++)if(i<10 || i>NF-56) printf "%s" , $i","}
{print $NF}
' your_file > new_file
Eu tenho um arquivo CSV grande (~ 15 GB) que um cliente enviou como uma exportação de uma tabela. O formato é o seguinte:
field, ... , field, field which sometimes contains commas,
another field which sometimes contains commas, field, ... , field
Consequentemente, não consigo importar os dados por causa do deslocamento produzido em algumas linhas em que os campos contêm uma ou mais vírgulas.
Eu não preciso dos dados nesses dois campos, portanto, livrar-se deles provavelmente seria a melhor opção. Consequentemente, para evitar os dois campos no meio que causam problemas, eu estava pensando em algo que para cada linha levaria os primeiros 9 campos (os antes dos dois) e os últimos 57 campos (os depois dos dois). / p>
Suponho que isso é algo que pode ser feito com sed
ou awk
, mas minha experiência com essas ferramentas (ou qualquer outra que seja melhor) é bastante limitada.
Usando o Perl:
$ perl -F, -wane 'print "$F[0],$F[-1]"' your_file > new_file
Além disso, você pode usar sed
, já que não se importa com nada no meio, que é essencialmente tudo entre as duas vírgulas externas, você pode fazer isso:
$ sed 's/,.*,/,/g' your_file > new_file
Os primeiros 9 campos e os últimos 57 campos
perl -F, -ane 'BEGIN {$,=","} print @F[0..9], @F[-57..-1]' file > newfile
Não foi possível resistir: aqui está um script Python (2.7) que lê a entrada e grava as linhas modificadas de volta na saída:
try:
while True:
line = raw_input()
parts = line.split(',')
newLine = ','.join(parts[:9]) + ',' + ','.join(parts[-57:])
print newLine
except EOFError:
pass
Você pode salvá-lo em um arquivo como csvmod.py
e executar cat input.csv | python csvmod.py > output.csv
ou, se estiver procurando algo um pouco menos legível, poderá usar a seguinte linha:
cat input.csv | python -c "exec(\"try:\n while True:\n line = raw_input()\n parts = line.split(',')\n newLine = ','.join(parts[:9]) + ',' + ','.join(parts[-57:])\n print newLine\nexcept EOFError:\n pass\n\")" > output.csv
Eu acho que para uma solução Python 3 você só precisa substituir o raw_input
por input
.