2016-03-30 18 views
1

Bash ile ilgili bir sorunla karşılaştım, yakın zamanda kullanmaya başladım. Bir önceki soruda onun tarafından çözüldüğünden, çok fazla sihirli maddenin tek bir çizgi ile yapılabileceğini anlıyorum. Bu kez soru basittir:Bazı satırlar dizgilerdeyken satırları sıralamak nasıl yapılır

Ben bu biçime sahip bir dosya

2 2 10 
custom 
8 10 
3 5 18 
custom 
1 5 

dize custom (herhangi çizgi olabilir!) Ve diğer hatlara eşit sözcüklerin bir kısmını 2 ya da 3 numaraları var içinde. Çok İstenen çıkış Ben de bu biriyle giriş dosyanın üzerine yazmak istiyor

2 4 6 8 10 
custom 
8 9 10 
3 8 13 18 
custom 
1 2 3 4 5 

olduğunu numaraları ile çizgi sırası fakat (aynı olmalıdır ayrıca sipariş) özel olan çizgiler tutacak bir dosyayı istiyorum. Seq ile sıralamayı yapabileceğimi biliyorum, ancak dosyada yapmanın zarif bir yolunu diliyorum.

cevap

3

Böyle awk kullanabilirsiniz:

awk '/^([[:blank:]]*[[:digit:]]+){2,3}[[:blank:]]*$/ { 
    j = (NF==3) ? $2 : 1 
    s="" 
    for(i=$1; i<=$NF; i+=j) 
     s = sprintf("%s%s%s", s, (i==$1)?"":OFS, i) 
    $0=s 
} 1' file 

2 4 6 8 10 
custom 
8 9 10 
3 8 13 18 
custom 
1 2 3 4 5 

Açıklama:

  • - 2 veya 3 numaralı sadece çizgiler maç.
  • j = (NF==3) ? $2 : 1-3 sütun aksi oluşturulan sekansı
  • biçimlendirmek için kullanılan j
  • sprintf tarafından 1
  • for(i=$1; i<=$NF; i+=j) sokma col, artım 1st col bir döngü j ayarlanmış olup olmadığını j$2 değişken ayarlanmış
  • 1 varsayılan awk GNU sed Bu sizin (için işe yarayabilecek her satırı
+1

özel herhangi bir satır, belki de '1 garip satır' olabilir. Sorudan uzak değil, doğrudan doğruya çözüm için destek olun. –

+0

Çalışmıyordu. Belki daha net olmalıydım, herhangi bir çizgi özel olarak eşit olabilir ve tam anlamıyla "custom" dizgesi olacak, diğer satırlarda 2 veya 3 rakam olabilir ve satırdaki herhangi bir sayı olabilir, bu kodu dosya için test ediyorum 2 2 10 idi; özel; 2 6 10; özel; 1 5 (; Satırı temsil eder), 2 6 10 çıkış için 2 6 olması gerektiğini unutmayın - Özel olarak –

+0

'a eşit olmayan herhangi bir satırda seq komutu yapmak istiyorum. Eğer yardımcı olursa, dosya 1, 2 veya 3'e sahip olabilir çizgiler. Bundan bahsetmedim çünkü daha genel bir çözüm istedim. Dosyadaki maksimum satır sayısı 3 olduğu için, 8 sorunun tamamını ele alacak başka ifadeler varsa, bu sorunu el ile çözebilirim, ancak daha zarif bir çözüm beklediğimi umuyordum. –

0

yazdırmak için eylem, seq ve p aste): Çizgi bir rakam ile başlayan

sed '/^[0-9]/s/.*/seq & | paste -sd\\ /e' file 

Eğer komutu yapıştırın taşınıyor seq komutu için parametre olarak çizgiler değerleri kullanın. Yedek komutun RHS'si, e bayrağı (GNU sed specific) kullanılarak değerlendirilir.

İlgili konular