テーブルに特定の列を追加する

テーブルに特定の列を追加する

次のような命名スタイルのテーブルがいくつかあります。

INSTITUTE_MODEL_SCENARIO_RIVER.txt

例:

wbm_gfdl_rcp8p5_mississippi.txt
wbm_hadgem_rcp8p5_mississippi.txt
wbm_miroc_rcp8p5_mississippi.txt
matsiro_gfdl_rcp4p5_mississippi.txt
matsiro_ipsl_rcp8p5_mississippi.txt

ファイル名にINSTITUTEandという名前が含まれるものをグループ化した出力テーブルを作成したいと思います。そのために、次のループを使用します。SCENARIO

for institute in wbm matsiro
do
  for scenario in rcp4p5 rcp8p5
  do
    paste "$institute"_*_"$scenario"* > "$hyd_model"_"$scenario".txt
  done
done

残念ながら、最初のテーブルにテーブルを追加する際に、最初の 3 つの列を削除したいです (冗長性を避けるため)。コマンドラインでこれを行う方法はわかっています。

paste wbm_gfdl_rcp8p5_mississippi.txt <(cut -f4 wbm_hadgem_rcp8p5_mississippi.txt) <(cut -f4 wbm_miroc_rcp8p5_mississippi.txt) > output.txt

しかし、ループ内でそれを実装することはできませんでしたfor。ヒントがあれば歓迎します!

答え1

興味深い質問ですね。配列を使用して関連ファイルをキャプチャし、再帰関数を使用して各追加ファイルを貼り付けます。

paste_files() {
    if [[ "$#" -eq 0 ]]; then
        cat -
    else
        paste - <(cut -f4 "$1") | paste_files "${@:1}"
    fi
}

for institute in wbm matsiro; do
    for scenario in rcp4p5 rcp8p5; do
        files=( "$institute"_*_"$scenario"* )
        cat "${files[0]}" | paste_files "${files[@]:1}" > "$hyd_model"_"$scenario".txt
    done
done

関連情報