結合を使用した複数ファイルのマージ

結合を使用した複数ファイルのマージ

最初の列に基づいて一度に複数のファイルを結合する回避策はありますか?通常私はこうします: join File1 File2 > File1+File2そしてFile1+File2 File3 > final_output

サンプルファイル:

ファイル1:

1 test1
2 test3
3 test4
4 test5
7 test7

ファイル2:

1 example1
2 example2
3 example3
4 example4
8 example8

ファイル3:

1 foo1
2 foo2
3 foo3
4 foo4
10 foo10

5行目はファイルごとに異なる可能性があり、nファイル数が多いことを考慮してください。 編集する:

出力例:

1 test1 example1 foo1
2 test2 example2 foo2
3 test3 example3 foo3
4 test4 example4 foo4

一方、1列(5行)の一致しない行をどのように処理するのかわかりません。ありがとうございます。

答え1

デフォルトでは3つのファイルの例と同じです。

$ join file2 file3| join file1 -
1 test1 example1 foo1
2 test3 example2 foo2
3 test4 example3 foo3
4 test5 example4 foo4

しかし重要なことすべての入力ファイルはすでにソートされている必要があります(sort -k 1b,1例のような数値ソートは機能しない可能性があります!)。したがって、上記の動的ソートの例はbash次のように書くことができます。

join <(sort -k 1b,1 file2) <(sort -k 1b,1 file3) | join <(sort -k 1b,1 file1) -\
  | sort -k 1n,1

最後に、再帰関数を使用するn個のファイルの一般的なケースです(でテスト済みbash)。

xjoin() {
    local f
    local srt="sort -k 1b,1"

    if [ "$#" -lt 2 ]; then
            echo "xjoin: need at least 2 files" >&2
            return 1
    elif [ "$#" -lt 3 ]; then
            join <($srt "$1") <($srt "$2")
    else
            f=$1
            shift
            join <($srt "$f") <(xjoin "$@")
    fi
}

xjoin file1 file2 file3 | sort -k 1n,1

実行している作業がわかっている場合は、ソートパイプラインを省略できます。しかし、私の経験上、joinこれについて明確ではないと、sort問題が発生することがよくあります。

関連情報