最初の列に複数のファイルをマージする

最初の列に複数のファイルをマージする

私のディレクトリには、異なる名前の50以上のファイルがあります。たとえば、

ファイル1:

Type,A,
RR,1,
CD,2,

ファイル2:

Type,B,
CD,2,
FG,3,

ファイル3:

Type,C,
RR,5,
FG,8,
QR,9,

希望の出力

Type,A,B,C,
CD,2,2,,
FG,,3,8,
QR,,,9,
RR,1,,5

試してみましたが運がありませんでしjoinpaste。どんな提案がありますか?

ベストアンサー1

これはかなりトリッキーなGNU awkです。gawkGNU awkが必要( )配列の配列

gawk -F, '
    NR  == 1 {n=1; header[n] = $1}
    FNR == 1 {n++; header[n] = $2; next}

    !($1 in data) {data[$1][1] = $1}
    {data[$1][n] = $2}

    # from https://www.gnu.org/software/gawk/manual/html_node/Join-Function.html
    function join(array, start, end, sep,    result, i)
    {
        if (sep == "")
            sep = " "
        else if (sep == SUBSEP) # magic value
            sep = ""
        result = array[start]
        for (i = start + 1; i <= end; i++)
            result = result sep array[i]
        return result
    }

    END {
        print join(header, 1, n, FS)
        PROCINFO["sorted_in"] = "@ind_str_asc"   # for sorted output
        for (type in data)
            print join(data[type], 1, n, FS)
    }
' file{1,2,3}
Type,A,B,C
CD,2,2,
FG,,3,8
QR,,,9
RR,1,,5

各ファイルには2つの列があると仮定するため、完全に普遍的ではありません。


GNU awkに依存しないバージョン(mawkでテスト)

mawk -F, '
    NR  == 1 {n=1; header[n] = $1}
    FNR == 1 {n++; header[n] = $2; next}
    {key[$1]; data[$1,n] = $2}
    END {
        for (i=1; i<=n; i++)
            printf "%s%s", header[i], (i==n ? ORS : FS)
        for (type in key) {
            printf "%s%s", type, FS
            for (i=2; i<=n; i++)
                printf "%s%s", data[type,i], (i==n ? ORS : FS)
        }
    }
' file{1,2,3}

おすすめ記事