2011-11-05 3 views

risposta

34

Non possibile di per sé. È necessario un secondo file temporaneo perché non è possibile leggere e sovrascrivere lo stesso file. Qualcosa di simile:

awk '(PROGRAM)' testfile.txt > testfile.tmp && mv testfile.tmp testfile.txt 

Il programma mktemp è utile per generare nomi unici file temporaneo.

Ci sono alcuni hack per evitare un file temporaneo, ma si basano principalmente sulla memorizzazione nella cache e sui buffer di lettura e diventano rapidamente instabili per file di grandi dimensioni.

+1

+1 per la risposta corretta. –

+0

Esiste una sintassi di file temporanea che determina la cancellazione del file in seguito? Ho visto uno script ddwrt simile a tempfile ._ $$ e non ha mai rimosso il file. – tudor

6

Nonostante il fatto che l'utilizzo di un file temporaneo è corretto, non mi piace perché:

  • bisogna essere sicuri di non cancellare un altro file temp (sì, si può usare mktemp - è un strumento abbastanza utile)

  • devi occuparti di eliminarlo (o spostarlo come detto thiton) INCLUSO quando lo script si blocca o si ferma prima della fine (quindi eliminare i file temporanei alla fine dello script non è così saggio)

  • it generat e IO su disco (ok non più di tanto, ma siamo in grado di renderlo più leggero)

Quindi il mio metodo per evitare file temporaneo è semplice:

my_output="$(awk '(PROGRAM)' source_file)" 
echo "$my_output" > source_file 

Nota l'uso di virgolette doppie sia quando afferrare il uscita dal comando awk E quando si usa echo (se non lo fai, non avrai newline).

3

È anche possibile utilizzare sponge da moreutils.

Ad esempio

awk '!a[$0]++' file|sponge file 

rimuove linee duplicate

awk '{$2=10*$2}1' file|sponge file 

moltiplica seconda colonna 10.

7

Da GNU Awk 4.1.0, v'è l'estensione "inplace", quindi puoi fare:

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3 

di tenere una copia di backup dei file originali, provate questo:

$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/foo/, "bar") } 
> { print }' file1 file2 file3 

Questo può essere usato per simulare la funzionalità di GNU sed -i.

See: Enabling In-Place File Editing

2

dovuto fare un account quando vedendo 'awk' e 'impossibile' in una sola frase.Ecco una soluzione awk solo senza creare un file temporaneo:

awk '{a[b++]=$0} END {for(c=1;c<=b;c++)print a[c]>ARGV[1]}' file 
0

cercare di includere dichiarazione nel file awk in modo che si può trovare l'uscita in un nuovo file. Qui il totale è un valore calcolato.

print $total, total >> "new_file" 
Problemi correlati