テーブルの作成 - ファイル名に基づいて列を追加する

テーブルの作成 - ファイル名に基づいて列を追加する

次のような命名スタイルを持つ多くのファイルがあります。

WBM_MIROC_rcp8p5_mississippi.txt
WBM_GFDL_rcp8p5_nosoc_mississippi.txt
DBH_HADGEM_rcp4p5_co2_mississippi.txt
HMH_IPSL_rcp4p5_mississippi.txt

これらのファイルは次の形式の表を表します(一部のファイルにはタブ区切り文字があり、他のファイルにはスペース区切り文字があります)。

YEAR MONTH DAY RES
1971 1 1 1988
1971 1 2 3829
...

rcp8p5名前に含まれるすべてのファイルを1つの大きなテーブルにグループ化したいと思いますrcp4p5。名前に含まれるファイルに対して同じことを行います。しかし、最初の3つの列が常に同じ重複を避けるために、各ファイルに4つの列だけを貼り付けたいと思います。現在、次のスクリプトを使用しています。

ls |
awk -F_ '{ i=$1; m=$2; s=$3; u=$4;
          if(f[s]=="")add = $0;
          else add = sprintf("<(cut -f4 %s)",$0);
          f[s] = f[s] " " add }
          END{ for(insc in f)
                 printf "paste%s > out_%s.txt\n",f[insc],insc
          }' |bash

理由はわかりませんが、出力が予想と異なります。次の出力があります。

YEAR MONTH DAY RES YEAR MONTH DAY RES YEAR MONTH DAY RES
1971 1     1   187 1971 1     1   143 1971 1     1   234
1971 1     2   321 1971 1     2   398 1971 1     1   754
...

代わりに、次のような出力が必要です。

YEAR MONTH DAY RES RES RES
1971 1     1   187 143 234
1971 1     2   321 398 754

誰でも私にヒントを与えることができれば良いでしょう!

ベストアンサー1

最も可能性の高い答えは、データファイル列がタブで区切られず、スペースで区切られていることです。cat -vet実際のタブが表示されている場所のいずれかを実行してこれを確認できます^I

スペースを区切り文字として使用するようにコマンドを変更するには、cutargを追加する必要がありますが、すでに単一引用符とawkスクリプト内にあるので、次のように-d' '変更する必要があります。sprintf(...)

sprintf("<(cut -d\" \"  -f4 %s)",$0)

おすすめ記事