5

私はtxtファイルを持っていますが、それらはすべて同じディレクトリにあります。それぞれに 2 列のデータがあります。それらは次のようになります。

ラベル
1 データA1 ラベル2 データA2 ラベル3
データA3

join を使用して、このような 1 つの大きなファイルを作成したいと考えています。

Label1 DataA1 DataB1 DataC1
Label2 DataA2 DataB2 DataC2 Label3
DataA3 DataB3 DataC3

現在、私は

ファイルAファイルBに参加 | 結合 - fileC

ただし、ファイルが多すぎて、すべてを一覧表示するのが実用的ではありません。この種のコマンドのループを作成する方法はありますか?

4

4 に答える 4

4

bash を使用すると、結合のために再帰的なパイプ実行を行うスクリプトを作成できます。

#!/bin/bash

if [[ $# -ge 2 ]]; then
    function __r {
        if [[ $# -gt 1 ]]; then
            exec join - "$1" | __r "${@:2}"
        else
            exec join - "$1"
        fi
    }

    __r "${@:2}" < "$1"
fi

そして、次のようにファイルをパラメーターとしてスクリプトに渡します。

bash script.sh file*

または、次のようなソートされたフォーム:

find -type f -maxdepth 1 -name 'file*' -print0 | sort -z | xargs -0 bash script.sh
于 2013-08-09T18:41:55.437 に答える
2

awk を使用すると、次のように実行できます。

awk 'NF > 0 { a[$1] = a[$1] " " $2 } END { for (i in a) { print i a[i]; } }' file*

ファイルを並べ替える場合:

find -type f -maxdepth 1 -name 'file*' -print0 | sort -z | xargs -0 awk 'NF > 0 { a[$1] = a[$1] " " $2 } END { for (i in a) { print i a[i]; } }' 

for (i in a) は、キーが追加された順序ではないため、並べ替えることもできますが、これは gawk でのみ使用できます。順序のインデックス付き配列にキーをマッピングするという考えは、列 1 に違いがない場合にのみ可能です。

gawk 'NF > 0 { a[$1] = a[$1] " " $2 } END { count = asorti(a, b); for (i = 1; i <= count; ++i) { j = b[i]; print j a[j]; } }' ...
于 2013-08-09T18:03:50.103 に答える
-1

すべてのファイルを 1 つのフォルダーに入れて実行するだけです。

join * | join - /someotherdir/fileC
于 2013-08-09T17:25:27.807 に答える