Tenho um arquivo data.csv que quero converter para txt e depois descobrir quantos números pares ele contém:
meu data.csv é assim:
# Recorded data from sensor XaB.v2
# Recording started on Oct 29 15:00:00
# Recording ended on Oct 29 15:15:59
# X, Y, Z, X', Y', Z'
55, 14, 48, 62, 78, 41
32, 52, 94, 11, 17, 83
e assim por diante.
Eu tentei dessa forma, mas talvez haja uma maneira melhor
grep -v '^#' data.csv | sed -e 's/,//g' > data.txt
grep -o '[0-9]\+' data.txt | awk '$1%2 == 0' | wc -l
especialmente o comando sed, não sei se essa é a maneira ideal.
Então eu tenho que criar n cópias do meu data.txt com valores escalonados divididos por i, novamente eu tentei com este script, mas não sei se há uma maneira mais simples e limpa de fazer isso:
n=$1
for ((i=1; i<=n; i++)) do
awk -v divisor="$i" '{ for (j=1; j<=NF; j++) printf "%.6f", $j / divisor; print "" }' data.txt > "data_${i}.txt"
done
Não incluí as verificações necessárias (sintaxe e n como um inteiro positivo) neste snippet.
Você pode usar
awk
para contar os números pares. Use uma condição noawk
script para filtrar linhas de comentários, em vez de canalizar desed
.Versões recentes do GNU
awk
podem analisar o formato CSV (-k
ou--csv
opção). Para o primeiro objetivo (contar valores pares):Para o segundo objetivo, também podemos deixar
awk
o loop mais externo rodar:(espaços adicionados para separar os valores de saída). Note que com CSV simples como este (sem campos multi-linha, sem campos entre aspas com vírgulas...), mesmo com versões mais antigas ou não GNU de
awk
, como mostrado na resposta de Barmar, poderíamos usar-F ','
e obter o mesmo resultado que com-k
.Em relação a este uso específico de
sed
, você pode substituí-lo por uma ferramenta mais específica, a saber,tr
seguindo o caminhoembora, seja supérfluo em seu snippet. 2n grep extrai um ou mais dígitos, números podem ser cortados por um ou mais caracteres não-dígitos. Depois de implementar essa mudança, seu código se torna
Você não precisa de wc, pois o GNU
awk
pode ser usado para contar a si mesmo, ou seja,o cnt é aumentado em 1 se a condição for mantida e após o processamento (at
END
)print
ed,+0
é usado para impor o número, se a condição nunca foi atendida.Na maioria das vezes você não precisa de grep na frente do
awk
comando, no seu casoInformei ao GNU AWK que o campo consiste em um ou mais dígitos usando
FPAT
umfor
loop para percorrer os campos em cada linha.Na maioria das vezes você não precisa de grep na frente do
awk
comando, no seu casoAdicionei
!/^#/
para excluir (!
é negação) linhas que começam com o caractere #.(testado no GNU Awk 5.3.1)