複数のファイルを組み合わせる

複数のファイルを組み合わせる

複数の.txtファイルがあり、最初の列(番号)に基づいてファイルをマージし、欠落しているデータがある場合は「NULL」を埋めたいと思います。

ファイル1:

1 a
2 b
3 c

ファイル_2:

3 c
4 d
5 e

ファイル_3:

4 d
5 e
6 f

予想出力:

1 a NULL NULL
2 b NULL NULL
3 c c NULL
4 NULL d d
5 NULL e e
6 NULL NULL f

join -t $'\t' -a 1 -a 2 -1 1 -2 1 -e NULL -o 0,1.2,2.2 file_1 file_2 | join -t $'\t' -a 1 -a 2 -1 1 -2 1 -e NULL - file_3 > expected_outputこのコマンドは、列 1、2、3 に対して正しい出力を提供します。ただし、列4には「NULL」はありません。これを解決する方法はありますか?非常に長いパイプコマンドを書くよりも複数のファイルをマージするより良い方法はありますか?

ベストアンサー1

学んだ内容を広げてください。https://stackoverflow.com/a/13963634そしてプラサン

これはファイル数に関係なく機能します。

#!/bin/bash
tempdir=$(mktemp --directory)
trap "rm -r $tempdir" EXIT SIGTERM

for infile in "$@"; do
  sort "$infile" > "${tempdir}/${infile}.sorted"
  if [ -e "${tempdir}/final.results" ]
  then
    join -a1 -a2 -e "NULL" -o auto \
      "${tempdir}/final.results" "${tempdir}/${infile}.sorted" \
      > "${tempdir}/res"
    mv "${tempdir}/res" "${tempdir}/final.results"
  else
    cp "${tempdir}/${infile}.sorted" "${tempdir}/final.results"
  fi
done
cat "${tempdir}/final.results"

結果:

$ . join_multiple_files.sh file* | column -t
1  a     NULL  NULL
2  b     NULL  NULL
3  c     c     NULL
4  NULL  d     d
5  NULL  e     e
6  NULL  NULL  f

おすすめ記事