2011-10-21 30 views

cevap

22

deneyin:

awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' f2 f1 

Çıktı: Yukarıdaki kod

111 000 444 
222 111 555 
333 555 666 

Açıklama:

  • FNR==NR bütün Bir defada tüm bir dosya ile çalışmanızı sağlar. Bu durumda, f2 dosyadır. NR ve FNR her ikisi de FNR arasındaki farkla birlikte satır numaralarını içerir, NR'un artmaya devam ettiği yeni bir dosya okunduğunda 1'e sıfırlanır. Biz f2 dosya ile çalışırken
  • biz değeri olarak key ve üçüncü kolonuna ($3) olarak hat numarası (NR) kullanılarak a olarak adlandırılan bir dizi oluşturma edilir. next, eylem bloğunun kalanını atlamamıza izin veriyor.
  • Bir kez f2 dosya biter bitmez, f1 dosya üzerinde çalışmaya başlarız. NR==FNR durumu FNR 1 ve NR artmayacak kadar yanlış olmaz. Yani sadece ikinci eylem bloğu {$2=a[FNR]} üzerinde çalışılacak.
  • Bu bloğun yaptığı, satır numarasına bakarak ikinci sütun değerini dizi değerine yeniden atamasıdır. Sonunda,
  • 1 satırını yazdırır. Doğru döner ve awk gerçek ifadeleri, satırın yazdırılmasıyla sonuçlanır.
  • f2 f1, tanımlı dosyaların sırasıdır. f2 dosyasından bir dizi oluşturmak istediğimizden önce bunu koyarız.
+1

Komutu açıklar mısınız? Teşekkür – saloua

+0

@saloua Biraz açıklama ekledim. Umarım yardımcı olur! –

+1

Kullanım durumum çok az farklı (sadece biraz). Fark, ayrılmış alan yerine f1 ve f2 için virgülle ayrılmış bir dosyam oldu. Aynı komutu "-F" seçeneği ile denedim, ancak çıktı dosyası bu durumda virgül içermiyordu. Bunu düzeltmenin herhangi bir yolu var mı? – Ganesh

İlgili konular