Vamos Tentar Implementar o comando sed
Vamos considerar um exemplo de arquivo CSV com o seguinte conteúdo:
$ cat file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
- Para remover o 1º campo ou coluna :
$ sed 's/[^,]*,//' file
25,11
31,2
21,3
45,4
12,5
Esta expressão regular procura por uma sequência de não-vírgula([^,]*) caracteres e exclui-los, o que resulta no 1º campo de ficar removido.
- Para imprimir apenas o último campo, OU remover todos os campos, exceto o último campo:
$ sed 's/.*,//' file
11
2
3
4
5
Este regex remove tudo até a última vírgula(.*,) o que resulta na exclusão de todos os campos, exceto o último campo.
- Para imprimir apenas o 1º campo:
$ sed 's/,.*//' file
Solaris
Ubuntu
Fedora
LinuxMint
RedHat
Este regex(,.*) remove os caracteres a partir de 1 de vírgula até o final, resultando na exclusão de todos os campos, exceto o último campo.
- Para eliminar o 2º campo:
$ sed 's/,[^,]*,/,/' file
Solaris,11
Ubuntu,2
Fedora,3
LinuxMint,4
RedHat,5
A regex (,[^,]*,) procura por uma vírgula e a sequência de caracteres seguido por uma vírgula, o que resulta na correspondência com a 2ª coluna, e substitui esse padrão de correspondência com apenas uma vírgula, em última análise, terminando em eliminar a 2ª coluna.
Nota: Para excluir os campos no meio fica mais mais difícil no sed, já que cada campo tem de ser compensada, literalmente.
- Para imprimir apenas o 2º campo:
$ sed 's/[^,]*,\([^,]*\).*/\1/' file
25
31
21
45
12
A regex corresponda ao primeiro campo, no segundo campo e o resto, no entanto, os grupos do 2º campo sozinho. Toda a linha é agora substituído com o 2º campo(\1), portanto, apenas o 2º campo é exibido.
- Imprimir apenas as linhas em que a última coluna é um número único dígito:
$ sed -n '/.*,[0-9]$/p' file
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
A regex (,[0-9]$) verifica a existência de um único dígito no último campo e o p de comando imprime a linha que corresponde a esta condição.
- Para o número de todas as linhas no arquivo:
$ sed = file | sed 'N;s/\n/ /'
1 Solaris,25,11
2 Ubuntu,31,2
3 Fedora,21,3
4 LinuxMint,45,4
5 RedHat,12,5
Esta é a simulação do cat-n de comando. awk faz isso facilmente usando a variável especial NR. O '=' comandos do sed, dá o número da linha de cada linha, seguido por a linha em si. A sed de saída é encaminhado para outra sed comando para associar a cada 2 linhas.
- Substitua o último campo em 99 se o 1º campo é 'Ubuntu':
$ sed 's/\(Ubuntu\)\(,.*,\).*/\1\299/' file
Solaris,25,11
Ubuntu,31,99
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
Este regex corresponda 'Ubuntu' e, até o fim, exceto a última coluna e grupos, cada um deles também. Na peça de substituição, o 1º e o 2º grupo, juntamente com o novo número 99 é substituído.
- Excluir o 2º campo se o 1º campo é 'RedHat':
$ sed 's/\(RedHat,\)[^,]*\(.*\)/\1\2/' file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,,5
1º o campo "RedHat", o 2º campo e os campos restantes são agrupados, e a substituição é feita apenas com o 1º e o último grupo , resuting em obter a 2ª campo excluído.
- Para inserir uma nova coluna no final(última coluna) :
$ sed 's/.*/&,A/' file
Solaris,25,11,A
Ubuntu,31,2,A
Fedora,21,3,A
LinuxMint,45,4,A
RedHat,12,5,A
A regex (.*) corresponde a toda a linha e substituindo-o com a linha em si (&) e o novo campo.
- Para inserir uma nova coluna em o início(1ª coluna):
$ sed 's/.*/A,&/' file
A,Solaris,25,11
A,Ubuntu,31,2
A,Fedora,21,3
A,LinuxMint,45,4
A,RedHat,12,5
Mesmo como último exemplo, apenas a linha correspondente é seguido pela nova coluna
Espero que isso irá ajudá-lo. Deixe-me saber se você precisar usar o Awk ou qualquer outro comando.
Obrigado
sed -Ei "$rownum s/$newvalue/$col" file.csv
e ele jogou um erro, mas gostaria de saber mais sobre isso. Qualquer recurso para ler nos seria útil.