真珠

真珠

以下の4つの列を持つCSVファイルがあります。

aa,bb,cc,dd  
ee,bb,cc,dd  
ff,bb,cc,dd  
xx,11,22,33  
yy,11,22,33  

私はそれを次のように変更したいと思います:

aa,ee,ff,bb,cc,dd  
xx,yy,11,22,33  

デフォルトでは、最後の3つの同じ列を持つ行を見つけて、最初のフィールドをマージします。

BashやPythonでこれを行う方法を知っている人はいますか?

ベストアンサー1

以下はプログラムですawk

#!/bin/awk -f
BEGIN {OFS = FS = ","}
{
    gsub(/ +$/, "", $4)
    field = $2","$3","$4
    if (field in a)
        a[field] = a[field]","$1
    else
        a[field] = $1
}
END { for (i in a) print a[i], i}

追加のPythonプログラムがあります:

from collections import OrderedDict

records = OrderedDict()
for line in open('file1'):
    field, key = line.strip().split(',', 1)
    records.setdefault(key, []).append(field)
for key, fields in records.items():
    print(','.join(fields + [key]))

結果:

aa,ee,ff,bb,cc,dd
xx,yy,11,22,33

おすすめ記事