column1に基づいて複数の行を結合する


8

以下のようなファイルがあります。

abc, 12345
def, text and nos    
ghi, something else   
jkl, words and numbers

abc, 56345   
def, text and nos   
ghi, something else 
jkl, words and numbers

abc, 15475  
def, text and nos 
ghi, something else
jkl, words and numbers

abc, 123345
def, text and nos
ghi, something else  
jkl, words and numbers

次のように変換(参加)したい:

abc, 12345, 56345, 15475, 123345
def, text and nos, text and nos,text and nos,text and nos
ghi, something else, something else, something else, something else   
jkl, words and numbers, words and numbers, words and numbers, words and numbers

2
入力ファイルに実際に余分な空白行がありますか?そうでない場合、喜ば編集をし、それらを削除するには、ファイルを表示する必要があり、正確にそれがあるとして。
terdon

回答:


10

出力の順序を気にしない場合:

$ awk -F',' 'NF>1{a[$1] = a[$1]","$2};END{for(i in a)print i""a[i]}' file 
jkl, words and numbers, words and numbers, words and numbers, words and numbers
abc, 12345, 56345, 15475, 123345
ghi, something else, something else, something else, something else
def, text and nos, text and nos, text and nos, text and nos

説明

  • NF>1 つまり、空白でない行のみを処理する必要があります。
  • 最初のフィールドをすべて連想配列aに保存します。キーは最初のフィールド、値は2番目のフィールド(または行の残りの部分)です。キーにすでに値がある場合、2つの値を連結します。
  • ENDブロック、我々は、連想配列をループa、値を対応するすべてのキーを印刷します。

または使用perlすると、順序が保持されます:

$perl -F',' -anle 'next if /^$/;$h{$F[0]} = $h{$F[0]}.", ".$F[1];
    END{print $_,$h{$_},"\n" for sort keys %h}' file
abc, 12345, 56345, 15475, 123345

def, text and nos, text and nos, text and nos, text and nos

ghi, something else, something else, something else, something else

jkl, words and numbers, words and numbers, words and numbers, words and numbers

私の質問からのあなたのperlソリューションunix.stackexchange.com/questions/124181/…も正しく動作するでしょうか?
Ramesh 14

いいえ。OPは、重複しているかどうかに関係なく、列1に基づいて文字列を連結したいと考えています。あなたの質問は重複したくない。
cuonglm 2014

大丈夫。一見すると、私の質問とほとんど同じように見えました。:)
Ramesh 2014

1
きちんと、+ 1!ただし、順序は維持されず、フィールドがアルファベット順になっているこの特定の例でのみ再作成されます。
terdon

ちょうど笑うために、私はあなたの答えを読む前に、ほぼ同じアプローチを書きました:perl -F, -lane 'next unless /./;push @{$k{$F[0]}}, ",@F[1..$#F]"; END{print "$_@{$k{$_}}" foreach keys(%k)}' file:)偉大な心は同じように考えます!
terdon

1

ああ、それは簡単なことです。以下は、ファイルに表示されるキーの順序を保持する単純なバージョンです。

$ awk -F, '
    /.+/{
        if (!($1 in Val)) { Key[++i] = $1; }
        Val[$1] = Val[$1] "," $2; 
    }
    END{
        for (j = 1; j <= i; j++) {
            printf("%s %s\n%s", Key[j], Val[Key[j]], (j == i) ? "" : "\n");       
        }                                    
    }' file.txt

出力は次のようになります。

abc, 12345, 56345, 15475, 123345

def, text and nos, text and nos, text and nos, text and nos

ghi, something else, something else, something else, something else

jkl, words and numbers, words and numbers, words and numbers, words and numbers

末尾に余分な空白行があっても構わない場合は、printf行を次のように置き換えますprintf("%s %s\n\n", Key[j], Val[Key[j]]);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.