
Estou desenvolvendo um script, e ele realiza cálculos que preciso incluir em um arquivo texto já preenchido. O formato das linhas do arquivo é:
1 20/10/16 12:00 take car in the garage joe's garage
Dentro do script eu recebo um número dos cálculos, e esse número substituirá o primeiro número da linha. Por exemplo, o "calcular" retorna o valor 15, então o script deve acessar o arquivo em questão e alterar a linha em questão deverá ficar assim:
15 20/10/16 12:00 take car in the garage joe's garage
A questão é que não sei como realizar essa mudança. Pode ser em bash, awk, sed ou qualquer recurso disponível. Obrigado.
Responder1
Que tal:
awk -v old=$oldNum -v new=$newNum \
'{if ($1==old) {$1=new; print} else {print}}' input.txt > output.txt
Tentei assim:
$ cat input.txt
2 19/10/16 15:30 some other line
1 20/10/16 12:00 take car in the garage joe's garage
3 17/10/16 5:30 another one
$ oldNum=2
$ newNum=15
Execute o comando awk e então:
$ cat output.txt
15 19/10/16 15:30 some other line
1 20/10/16 12:00 take car in the garage joe's garage
3 17/10/16 5:30 another one
É isto o que você queria ? Se você quiser que seu resultado apareça no arquivo original, apenas mv
o arquivo de saída com o novo nome input.txt
, que deve sobrescrever o arquivo de entrada (use uma barra anti-barra \mv
para evitar alias do mv
comando).
NOTA: você provavelmente pode obter o mesmo resultado com instruções awk mais curtas, mas esta sintaxe o torna mais legível. sed
provavelmente pode fazer isso de uma forma ainda mais concisa.
EDIT: Sei que isso funciona se você quiser alterar apenas 1 número em seu arquivo. Se entendi seu problema corretamente, você deseja recalcular o número paratodolinha e crie um arquivo com esses novos números. A maneira ideal de fazer isso seria incluir o cálculo do novo número de linhadentroo awk
script, dessa forma você não precisa criar um loop de shell, o que geralmente é uma má ideia, já que chamar ferramentas como awk
, echo
, sed
... repetidamente acaba sendo muito caro. Você poderia fazer algo assim:
if [ -f $PWD/output.txt ]; then
# Remove old output if present in current directory
\rm -f $PWD/output.txt
fi
awk '{ ###calculation here, result store in newNum###; $1=newNum; print}' input.txt > output.txt
Por exemplo, se eu quiser incrementar trivialmente apenas um em cada número de linha:
awk '{$1++; print}' input.txt > output.txt
Se você não pode (ou não ousa) incluir seu cálculo dentro de awk
, você pode fazer um loop no arquivo, mas isso é bastante desajeitado pelo que entendi de bash
scripts:
if [ -f $PWD/output.txt ]; then
# Remove old output if present in current directory
\rm -f $PWD/output.txt
fi
while read line
do
newNum=###Calculation here for current line###
echo $line | awk -v new=$newNum '$1=new' >> output.txt
done <input.txt
Responder2
tente isso..
awk -v num="$variable" '{$1=num}1' input.txt
Responder3
Aqui está um pequeno script python que faz o que você deseja. O uso é simples: forneça o arquivo, o número com o qual a linha começa e o número que você deseja ver
Demonstração:
bash-4.3$ gato data.txt 2 19/10/16 15h30 alguma outra linha 1 20/10/16 12:00 leva carro na garagem garagem do joe 3 17/10/16 5h30 outro bash-4.3$ python renumeração.py data.txt 1 15 ['renumeração.py', 'dados.txt', '1', '15'] bash-4.3$ gato data.txt 2 19/10/16 15h30 alguma outra linha 15 20/10/16 12:00 leva carro na garagem garagem do joão 3 17/10/16 5h30 outro
Código:
import sys
import os
print(sys.argv)
with open(sys.argv[1]) as inputfile:
with open('/tmp/temp.text','w') as tempfile:
for line in inputfile:
old = line.strip().split()
if old[0] == sys.argv[2]:
old[0] = sys.argv[3]
line = ' '.join(old) + '\n'
tempfile.write(line)
os.rename('/tmp/temp.text',sys.argv[1])