构建表 - 根据文件名添加列

ste*_*eve 5 awk text-processing paste

我有大量具有以下命名风格的文件:

WBM_MIROC_rcp8p5_mississippi.txt
WBM_GFDL_rcp8p5_nosoc_mississippi.txt
DBH_HADGEM_rcp4p5_co2_mississippi.txt
HMH_IPSL_rcp4p5_mississippi.txt
Run Code Online (Sandbox Code Playgroud)

这些文件表示表(其中一些具有制表符分隔符和其他一个空格分隔符),如下所示:

YEAR MONTH DAY RES
1971 1 1 1988
1971 1 2 3829
...
Run Code Online (Sandbox Code Playgroud)

我想将所有rcp8p5名称中的文件分组在一张大表中;并对rcp4p5名称中的文件执行相同操作。但是,我只想粘贴每个文件的 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
Run Code Online (Sandbox Code Playgroud)

不清楚为什么,但输出不符合预期。我有以下输出:

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
...
Run Code Online (Sandbox Code Playgroud)

相反,我想要以下输出:

YEAR MONTH DAY RES RES RES
1971 1     1   187 143 234
1971 1     2   321 398 754
Run Code Online (Sandbox Code Playgroud)

如果有人能给我一个提示,那就太好了!

meu*_*euh 2

最可能的答案是您的数据文件列不是用制表符分隔的,而是用空格分隔的。您可以通过运行其中一个来验证这一点,cat -vet其中真实选项卡显示为^I

要更改cut命令以使用空格作为分隔符,您需要添加 arg -d' ',但由于您已经在单引号和 awk 脚本内,因此您需要将其更改sprintf(...)

sprintf("<(cut -d\" \"  -f4 %s)",$0)
Run Code Online (Sandbox Code Playgroud)