2016-04-01 17 views
0

ile eşleşmesi durumunda satırları ekler, awk için mutlak bir başlangıç ​​yapıyorum ve bu konuda yardımcı olmak isterim.awk, belirli alanın

FOO|BAR|1234|A|B|C|D| 
FOO|BAR|1234|E|F|G|H| 
FOO|BAR|5678|I|J|K|L| 
FOO|BAR|5678|M|N|O|P| 
FOO|BAR|5678|Q|R|S|T| 

İstenilen çıktı:

Bu veriler var

FOO|BAR|1234|A|B|C|D|E|F|G|H| 
FOO|BAR|5678|I|J|K|L|M|N|O|P|Q|R|S|T| 

Temelde hatları sütun 3 maç için bazı alanları eklemek gerekir.

Herhangi bir yanıt için teşekkür ederiz, çok teşekkürler!

+0

yazdırmak zorunda mekanizmayı yeniden 'PQR | XYZ 5678 | D | C | B | A | 'sonunda eklenir; Örnek çıktınızın son satırına "D | C | B | A |" eklenmeli mi yoksa yeni bir çıktı satırı mı olmalı? Başka bir deyişle, şu anda söylediği soru olarak sadece 3. sütun olduğundan emin misiniz, yoksa 'daha mantıklı görünen' ilk üç sütun 'demek istiyor musunuz? –

+0

İşleme: boru sembollerine bölünmüş; sütun 3'te eski değerin bir kaydını tutmak; Eski ve geçerli değerler aynıysa, geçerli satıra 4-7 sütunları ekleyin; Eski ve geçerli değerler farklıysa, eski satırı (varsa) yazdırın ve sonra eski değeri sütun 3'e ayarlayın ve daha sonra eklenebilmesi için mevcut kaydı kaydedin. –

+0

'FOO | BAR | 5678 | I | J | K | L | M | N | O | P | Q | R | S | T | D | C | B | A' - bu ekstra çizgi ise sonuç olur. eklenecek. Çalıştığım veriler, aynı değerlere sahip bu alanlara sahip. – BlueHam

cevap

1

bir başka yolu:

awk -F"|" '$3 in a{ 
    a[$3]=a[$3]"|"$4"|"$5"|"$6"|"$7; 
    next 
} 
{ a[$3]=$0 
} 
END { 
    for (i in a) { 
     print a[i] 
    } 
}' 
1
$ awk -f chain.awk < data 
FOO|BAR|1234|A|B|C|D|E|F|G|H| 
FOO|BAR|5678|I|J|K|L|M|N|O|P|Q|R|S|T| 
$ cat chain.awk 
BEGIN {FS = "|"} 
$3==old {for(i = 4; i <= NF; i++) saved = saved (i>4?"|":"") $i} 
$3!=old {if(old) print saved ; saved = $0 ; old = $3} 
END  {print saved} 
$ 
  • BEGIN biz alanlarını ekleme alan ayırıcısını
  • $3==old set kaydedilen verilere $4 ... $NF, ilki hariç | ile alanları katılmadan (Not: Son, boş bir alan var.
  • $3!=old biz s yazdırıyoruz (old yanlış olduğunda ilk kayıt hariç) ve aved veriler,
  • END biz hala karnında verileri kaydetmiş, biz varsayalım o ekstra çizgiyi