Awk kullanarak yerinde bir dosyayı nasıl değiştirebilirim? (“sed -i” ile olduğu gibi)


11

Bir var awk, senaryoyu 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 }

Ben buna kabukta diyorum

awk new.awk sample.csv

... ama terminaldeki değişiklikleri görebiliyorum. Kullanırken olduğu gibi dosyada değişiklik nasıl yerinde yapılır sed -i?

Yanıtlar:


16

GNU awk(Linux sistemlerinde yaygın olarak bulunur), 4.1.0 sürümünden bu yana , komut satırında veya komut satırında bir " awkkaynak kitaplığı" içerebilmektedir . GNU ile dağıtılan kaynak kütüphanelerinden biri :-i--includeawkinplace

$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello

Gördüğünüz gibi bu, awkkodun çıktısını girdi dosyasının yerini alır. Satır deyimi there, program tarafından çıktı alınmadığından korunmaz.

awkBir dosyadaki bir komut dosyasıyla,

awk -i inplace -f script.awk datafile

Eğer awkdeğişken INPLACE_SUFFIXbir dizeye ayarlanır, daha sonra kütüphane bir dosya adı soneki olarak bu orijinal dosyanın bir yedeğini olacaktır.

awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile

Birden fazla giriş dosyanız varsa, her bir dosya ayrı ayrı yerinde düzenlenir. Ancak, inplace=0o dosyadan önceki komut satırını kullanarak bir dosya (veya bir dosya kümesi) için yerinde düzenlemeyi kapatabilirsiniz :

awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4

Yukarıdaki komutta, file3yerinde düzenlenemezdi.


Tek bir dosyanın daha taşınabilir "yerinde düzenlenmesi" için şunu kullanın:

tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"

Bu, giriş dosyasını geçici bir konuma kopyalar, ardından awkkodu özgün dosya adına yeniden yönlendirirken geçici dosyaya uygular .

İşlemleri bu sırayla yapmak ( awkorijinal dosyada değil, geçici dosyada çalışıyor ), orijinal dosyanın dosya meta verilerinin (izinler ve sahiplik) değiştirilmemesini sağlar.


4

Bunu dene.

awk  new.awk sample.csv > tmp.csv && mv -f tmp.csv sample.csv
  • çıkışı geçici bir dosyaya yeniden yönlendirir.
  • sonra geçici dosyanın içeriğini orijinal dosyaya taşıyın.

1
Awk inplace kaynak koduna bakarsanız , tam olarak yaptığı şey budur: geçici bir dosya oluşturur, stdout'u oraya yönlendirir ve sonunda onu giriş dosyasına yeniden adlandırır.
chx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.