O texto a seguir está usando csvkit
, porque a análise de dados CSV que contêm vírgulas em campos com aspas com awk
é propensa a erros .
Isso obterá a coluna três no formato correto:
csvcut -c 3 file.csv |
sed -r 's/^"|"$//g' |
awk -F';' -vOFS=';' '{ for (i=1; i<=NF; ++i) $i = substr($i, 0, 2) } { printf("\"%s\"\n", $0) }' >tmp-3rd
Para a entrada dada, isso produz
"AB;xy;15"
"C4;x2;rt"
-
csvcut
vai cortar a terceira coluna. -
sed
removerá as aspas duplas dos dados, se aparecerem primeiro ou por último na linha. - O programa
awk
passará pelos campos;
-delimited e os reduzirá a um tamanho de dois caracteres por campo. Imprime os dados com aspas duplas em torno dele. - A saída é gravada no arquivo
tmp-3rd
.
Então, é apenas uma questão de remontar isso com os dados originais (isto está assumindo bash
ou qualquer outro shell que possa fazer substituições de processo com <(...)
):
paste -d, <( csvcut -c 1,2 file.csv ) tmp-3rd <( csvcut -c 4,5 file.csv ) | csvformat
-
paste
irá colocar as colunas juntas com vírgulas no meio. - A primeira substituição de processo produz as duas primeiras colunas do arquivo original e a segunda produz as duas últimas colunas. No meio, nós fornecemos a terceira coluna modificada.
- Como uma etapa opcional, passamos os dados por meio de
csvformat
, o que irá citar ou desmarcar campos conforme necessário.
A saída será
pav,12345,AB;xy;15,,
xyz,,C4;x2;rt,,
Ignorando a necessidade do arquivo temporário:
paste -d, \
<( csvcut -c 1,2 file.csv ) \
<( csvcut -c 3 file.csv | sed -r 's/^"|"$//g' |
awk -F';' -vOFS=';' '{ for (i=1; i<=NF; ++i) $i = substr($i, 0, 2) } { printf("\"%s\"\n", $0) }' ) \
<( csvcut -c 4,5 file.csv ) | csvformat