web-dev-qa-db-ja.com

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

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

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
8
pvkbhat

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

$ 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
10
cuonglm

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

_$ 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]]);に置き換えてください。

1
user61786