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 }
Eu estou chamando isso em shell
awk new.awk sample.csv
... mas posso ver as mudanças no terminal. Como fazer a alteração in-loco no arquivo, como ao usar sed -i
?
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. Uma das bibliotecas de origem que é distribuída com GNUawk
é uma chamadainplace
:Como você pode ver, isso faz com que a saída do
awk
código substitua o arquivo de entrada. A linha dizendothere
não é mantida, pois o programa não a produz.Com um
awk
script em um arquivo, você o usaria comoSe a
awk
variávelINPLACE_SUFFIX
for definida como uma string, a biblioteca fará um backup do arquivo original com isso como um sufixo de nome de arquivo.Se você tiver vários arquivos de entrada, cada arquivo deve ser editado individualmente no local. Mas você pode desativar a edição no local para um arquivo (ou um conjunto de arquivos) usando
inplace=0
a linha de comando antes desse arquivo:No comando acima,
file3
não seria editado no local.Para uma "edição no local" mais portátil de um único arquivo, use
Isso copiaria o arquivo de entrada para um local temporário e aplicaria o
awk
código no arquivo temporário enquanto redirecionava para o nome do arquivo original.Fazer as operações nesta ordem (executando
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.Tente isso.