.png)
Eu tenho um awk
script new.awk
:
BEGIN { FS = OFS = "," }
NR == 1 {
for (i = 1; i <= NF; i++)
f[$i] = i
}
NR > 1 {
begSecs = mktime(gensub(/[":-]/, " ", "g", $(f["DateTime"])))
endSecs = begSecs + $(f["TotalDuration"])
$(f["CallEndTime"]) = strftime("%Y-%m-%d %H:%M:%S", endSecs)
}
{ print }
Estou chamando isso em shell
awk new.awk sample.csv
... mas posso ver as mudanças no terminal. Como fazer a alteração no local do arquivo, como ao usar sed -i
?
Responder1
GNU awk
(comumente encontrado em sistemas Linux), desde a versão 4.1.0, pode incluir uma " awk
biblioteca fonte" com -i
ou --include
na linha de comando (vejaComo usar com segurança a opção -i do gawk ou a diretiva @include?junto com o comentário de Stéphane abaixo sobre questões de segurança relacionadas a isso). Uma das bibliotecas fonte distribuídas com o GNU awk
é chamada inplace
:
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
Como você pode ver, isso faz com que a saída do awk
código substitua o arquivo de entrada. A linha que diz there
não é mantida porque o programa não a gera.
Com um awk
script em um arquivo, você o usaria como
awk -i inplace -f script.awk datafile
Se a awk
variável INPLACE_SUFFIX
for definida como uma string, a biblioteca fará um backup do arquivo original com isso como sufixo do nome do arquivo.
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
Se você tiver vários arquivos de entrada, cada arquivo será editado individualmente no local. Mas você pode desativar a edição local de um arquivo (ou conjunto de arquivos) usando inplace=0
na linha de comando antes desse arquivo:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
No comando acima, file3
não seria editado no local.
Para uma "edição local" mais portátil de um único arquivo, use
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
Isso copiaria o arquivo de entrada para um local temporário e, em seguida, aplicaria o awk
código no arquivo temporário enquanto redirecionava para o nome do arquivo original.
Fazer as operações nesta ordem (executar awk
no arquivo temporário, não no arquivo original) garante que os metadados do arquivo (permissões e propriedade) do arquivo original não sejam modificados.
Responder2
Experimente isso.
awk new.awk sample.csv > tmp.csv && mv -f tmp.csv sample.csv
- redirecione a saída para um arquivo temporário.
- em seguida, mova o conteúdo do arquivo temporário para o arquivo original.