Preciso modificar um arquivo csv usando o bash.
Entrada (um arquivo csv):
firstletter="s"
surname="houston"
emaildomain"@zzz.com"
input=$(cat 1.csv)
1.csv:
1,1,Susan houston,Director of Services,,
2,1,Christina Gonzalez,Director,,
3,2,Brenda brown,"Director, Second Career Services",,
Como posso adicionar um texto entre as últimas 2 vírgulas usando o Linux bash? Eu tentei algo como:
for i in $(cat $input);do
sed -i "s/,$/${firstletter}${surname}${emaildomain},/g" $i;
done
No entanto, isso resulta em um erro:
sed: -e expression #1, char 5: unterminated `s' command
Saída esperada:
1,1,Susan houston,Director of Services,[email protected],
2,1,Christina Gonzalez,Director,[email protected],
3,2,Brenda brown,"Director, Second Career Services",[email protected],
A pergunta não está clara, mas acho que pode ser isso que você está tentando fazer, usando o GNU awk para edição "in loco" e
gensub()
:Veja Qual é a maneira mais robusta de analisar CSV com eficiência usando o awk? para obter mais informações sobre o processamento de CSVs com o awk.
Tenho certeza de que há alguma inteligência nisso
sed
que permitiria alcançar o que você quer. Eu, pessoalmente, optaria pelo GNU awk aqui.-i inplace
é uma extensão GNU que permite ao awk emularsed
o s-i
.A
BEGIN
seção informa ao awk que tanto o separador de campo de entrada quanto o de saída são vírgulas.fn=gensub(...)
puxa a primeira letra do primeiro nome (o nome completo é o terceiro campo,$3
).Em seguida, dividimos o nome em uma matriz
ln
(supondo que algumas pessoas possam ter nomes do meio).Definimos o 5º campo (o espaço vazio entre as últimas vírgulas) para a primeira letra e o último elemento do array seguido por
@zzz.com
.Se $5 não estiver vazio:
Solução usando jq:
Com o parâmetro -R (--raw-input) ele lê texto simples.
Com o parâmetro -r (--raw-output) ele produz texto simples.