シェル:複数のテーブルを組み合わせる

シェル:複数のテーブルを組み合わせる

同じ作業ディレクトリに同じ数の行(列の間に区切り文字を含む)を含み、最初の列の順序を共有する2つのリストがあります。以下は、8行を含む2つのテーブルの例です。

表 1.csv

lig10| -5.4600
lig13| -5.9900
lig14| -4.2200
lig15| -4.9200
lig3| -6.9700
lig4| -7.4000
lig5| -6.0000
lig9| -6.5700

表 2.csv

lig10| -5.2400
lig13| -6.6900
lig14| -4.4600
lig15| -4.9600
lig3| -6.9000
lig4| -6.3100
lig5| -3.7900
lig9| -6.5800

非常に似た形式のすべてのテーブルを大きなテーブルに並べてマージし、結果テーブルにマージされたファイルの数に比例して同じ数の行と列が含まれるようにすべてのデータをインポートしたいと思います。たとえば、10個の個々のテーブルの場合は20個の列になります(注:すべてのテーブルが同じであっても常に最初の列を使用します!)。結果表の各2番目の列にヘッダーを追加したい(初期表)、初期ファイル名に基づいています。これは2つのテーブルへの期待される出力です。

ここに画像の説明を入力してください。

一部のLinuxユーティリティを使用して、1行のコマンドで端末のテーブルを融合できますか?

prog -i /workdir/*.csv  -o resulting_table.csv

答え1

それがpaste目的です。ただし、正しいファイル名を取得するには、いくつかのタスクを実行する必要があります。

$ ( printf '%s\t' *table*; echo; paste -d'\t' *table*)
name_of_file_with_table1    name_of_file_with_table2    
lig10| -5.4600  lig10| -5.2400
lig13| -5.9900  lig13| -6.6900
lig14| -4.2200  lig14| -4.4600
lig15| -4.9200  lig15| -4.9600
lig3| -6.9700   lig3| -6.9000
lig4| -7.4000   lig4| -6.3100
lig5| -6.0000   lig5| -3.7900
lig9| -6.5700   lig9| -6.5800

最初のファイルの最初の列だけが必要な場合は、はるかに簡単です。

$ ( printf '%s ' *table*; echo; join  *table* )
name_of_file_with_table1 name_of_file_with_table2 
lig10| -5.4600 -5.2400
lig13| -5.9900 -6.6900
lig14| -4.2200 -4.4600
lig15| -4.9200 -4.9600
lig3| -6.9700 -6.9000
lig4| -7.4000 -6.3100
lig5| -6.0000 -3.7900
lig9| -6.5700 -6.5800

ファイルがソートされていない場合は、まずファイルをソートする必要があります。

for f in *table*; do sort "$f" > $f.sorted; done

それから:

( printf '%s ' *table*sorted; echo; join  *table*sorted )

関連情報