2011-12-07 13 views
0

は、私はこのようなリストを持っているawkは:リストの要素は

私は同じ順序で最初の列内のすべての要素( s_)第二カラム( d_)内の要素のリストについては、取得する必要があり
s1 d2 
s1 d4 
s3 d2 
s4 d1 
s1 d3 
s4 d1 
s5 d6 
s3 d5 
s1 d2 
s1 d3 

外観の。この場合:

s1 d2 d4 d3 d2 d3 
s3 d2 d5 
s4 d1 d1  
s5 d6 

s_の順序は重要ではありません、d_の順序があります。 (リストが大きいので)簡単な方法を提案することはできますか?おそらくawkでは可能でしょうか?おそらく(コマンドラインの場合)このような

答えて

5

何か、:

awk '{ vals[$1] = vals[$1] " " $2 }; END { for (key in vals) { print key,vals[key] }}' list 

awkスクリプトとしてきれいにフォーマットされた:これは何

{ vals[$1] = vals[$1] " " $2 } 
END { 
    for (key in vals) { 
     print key,vals[key] 
    } 
} 

は、最初の値のインデックスで、お店です右側にプログレッシブ値を含む文字列。だから、それが見つかるたびに、それをその文字列の最後に連結します。最後に、各ペアを出力します。

+0

これは私がまさに必要で、かつ非常にあります簡単。 – markusian

2

私は連想配列を使用して "sX"を記憶し、次にその値に文字列連結を行います。ここで

BEGIN { 
print "ID\tList\n"; 
} 
{ 
id[$1]=id[$1] $2; 
} 
END{ 
for (var in id) 
    print var,"\t",id[var]; 
} 
1

あなたが行く:

awk '{ ss[$1]++ ; ds[$1 NR]=$2 } 
     END { for (e in ss) 
       { a=e 
        for (i=1;i<=NR;i++) 
         { a=a " " ds[e i] } 
        printf("%s\n",gensub(" +"," ","g",a)) 
       } 
     }' INPUTFILE 

HTH

1

これは、キーと値の両方の順序を保証する:

awk 'END { 
    for (i = 0; ++i <= c;) 
    print idx[i], s[idx[i]] 
    } 
{ 
    s[$1] = s[$1] ? s[$1] OFS $2 : $2 
    t[$1]++ || idx[++c] = $1 
    }' infile