Ben OP düzenlemek ve girdi_dosya (lar) içine işlemi kaydetmek zorunda (SO kendisi üzerinde) bir soru rastladım.
Aşağıdakileri yapabileceğimiz tek bir Input_file için biliyorum:
awk '{print "test here..new line for saving.."}' Input_file > temp && mv temp Input_file
Şimdi, aynı tür dosya biçimlerinde değişiklik yapmamız gerektiğini varsayalım (burada .txt olduğunu varsayalım).
Ne denedim / bu sorun için düşündüm: Onun yaklaşımı .txt dosyaları bir for döngüsü geçiyor ve tek çağırmakawk
acı verici ve tavsiye DEĞİL bir işlemdir, çünkü gereksiz CPU döngüleri israf edecek ve daha fazla sayıda dosya için daha fazla olurdu yavaş.
Burada, awk
yerinde seçeneği desteklemeyen bir NON GNU ile birden çok dosya için yerinde düzenleme yapmak için burada ne yapılabilir . Ben de bu iş parçacığından geçtim Değişiklikleri awk ile kaydedin ama GNON awk
olmayan bir awk inplace
seçeneğine sahip olmayacağından GNON awk yardımcısı ve kendi içinde birden fazla dosyayı değiştirmek için pek bir şey yok .
Not: nedenbash
etiketekliyorum, benim yanıt bölümünde, geçici dosyaları gerçek Input_file adlarını yeniden eklemek için bash komutları kullandım, böylece ekleyerek.
DÜZENLEME: Ed sir'in yorumuna göre, burada örneklerin bir örneğini ekleyerek, bu iş parçacığının kodunun amacı, genel amaçlı yerinde düzenlemede de kullanılabilir.
Örnek Girdi_dosyaları:
cat test1.txt
onetwo three
tets testtest
cat test2.txt
onetwo three
tets testtest
cat test3.txt
onetwo three
tets testtest
Beklenen çıktı örneği:
cat test1.txt
1
2
cat test2.txt
1
2
cat test3.txt
1
2
awk
(belki bir alt kabukta) veya {...}
kapalı bir grubu kullanmıyorsunuz ve sonuçları istenen çıktı dosyasına (her girdi dosyası için, veya tüm girdi dosyaları için birleştirilmiş bir dosya). Sonra alt kabuk veya küme ayracı kapalı grubun çıktısını yazılmakta olan geçerli dosyaya yönlendiriyor musunuz? Sadece awk
komutu takip giriş dosyaları bir dize dahil sırayla tüm dosyaları (veya benzer bir şey) işleyecek ??
awk {..} file1 .. fileX
, değiştirilmiş dosyayı şöyle yazarak 2 seçenek (1) görüyorum temp01
ve bir sonraki dosyayı işlerken sonraki yinelemede mv -f tmp01 input01
, değiştirilen verilerle giriş dosyasının üzerine yazmak için a kullanın; veya (2) komut dosyasının ./tmp/tmp01 ... ./tmp/tmp0X
yürütülmesi sırasında yeni bir dizin yazmanız ve dizindeki awk
dosyalar üzerinde bir döngü ile izlemeniz ./tmp
ve örn. mv -f "$i" "input_${i##*[^0-9]}"
(veya eski giriş dosyalarını değiştirmeniz için hangi genişleme yapmanız gerekiyorsa)
awk
tam kod tamamlanmadan bir şey yapıyoruz , 2. seçenek önerimde kullandığımın hemen hemen aynı olacak, Bu çözüm hakkında düşüncelerinizi bildirirseniz minnettar olun efendim.