2016-04-11 21 views
0

Bubenzersiz değerlere benzersiz olmayan değerlerle eşleşen

1 3 
1 2 
1 9 
5 4 
4 6 
5 6 
5 8 
5 9 
4 2 

benziyor veri Ben çıkışı benim orijinal bir sürü vardır

1 3,2,9 
    5 4,6,8,9 
    4 6,2 

Bu yalnızca örnek veriler olduğunu olabilir ama istiyorum var daha fazla değer.

+3

Sorunuz, şimdiye kadar neler yaptığınızı göstermek için düzenleyin. Sadece sahte kod olsa bile, sorununuzu çözmek için bazı çabalar gösterir ve bu yüzden başkalarını size yardımcı olmaya motive eder. BTW, ihtiyacınız olan aracı bulmanızda size yardımcı olur: grep, bir dosyada regexp ile eşleşen bir dizeyi basmak içindir - yapmaya çalıştığınız şey bu değil. sed bireysel çizgilerdeki basit ikameler içindir - aynı zamanda yapmaya çalıştığınız şey de değil. awk diğer tüm metin manipülasyonları içindir - yapmaya çalıştığınız şey budur. –

+0

Teşekkürler. Ben awk ile çalıştım. – Paul

+0

Harika, sonra tekrar - ** Şimdiye kadar denediğiniz şeyi göstermek için sorunuzu düzenleyin. **. –

cevap

1

Yani bu

Yani bu temelde bir anahtar olarak ilk sütunu ve değer olarak hattın ikinci sütunu kullanılarak, karma tablo oluşturur çalıştı:

awk '{line="";for (i = 2; i <= NF; i++) line = line $i ", "; table[$1]=table[$1] line;} END {for (key in table) print key " => " table[key];}' trial.txt 

ÇIKIŞ

4 => 6, 2 
5 => 4, 6, 8, 9 
1 => 3, 2, 9 
+0

Bu sizin denemenizdir ve sorunuzu almak istediğiniz çıktıyı üretmek için yardıma ihtiyacınız varsa, o zaman bu cevabı silin ve bunun yerine sorunuzu bu komut dosyasını içerecek şekilde düzenleyin ve neden yetersiz olduğunu açıklayın. Eğer bir çözüm bulduğunuzu ve yardım istemediğinizi söylüyorsanız, sadece sorunuzu silin, böylece başka hiç kimse ona bakmaktan zaman kaybetmez. –

+1

Bu kod soruyu yanıtlayabilirken, sağlamasının _why_ ve/veya _how_ ile ilgili ek bağlamı yanıtı bu soru uzun vadeli değerini önemli ölçüde artıracaktır. Lütfen bazı açıklama eklemek için cevabınızı [düzenleyin]. –

0

Ben yazacağımı

awk -v OFS=, ' 
    { 
     key = $1 
     $1 = "" 
     values[key] = values[key] $0 
    } 
    END { 
     for (key in values) { 
      sub(/^,/, "", values[key]) 
      print key " " values[key] 
     } 
    } 
' file 

her bir anahtarla (çok boyutlu diziler için GNU awk gerektirir) tuşlarının emriyle ilgili değilse

perl -lane ' 
    $key = shift @F; 
    $values{$key}{$_} = 1 for @F; 
} END { 
    $, = " "; 
    print $_, join(",", keys %{$values{$_}}) for keys %values; 
' file 
0

bence

gawk -v OFS=, ' 
    { for (i=2; i<=NF; i++) values[$1][$i] = i } 
    END { 
     for (key in values) { 
      printf "%s ", key 
      sep = "" 
      for (val in values[key]) { 
       printf "%s%s", sep, val 
       sep = "," 
      } 
      print "" 
     } 
    } 
' file 

veya perl için yalnızca benzersiz değerler istiyorsanız Bu deyimsel awk çözümüdür.

$ awk '{a[$1]=($1 in a?a[$1]",":"") $2} 
    END{for(k in a) print k,a[k]}' file | 
column -t 

4 6,2 
5 4,6,8,9 
1 3,2,9