组合来自与bash中的字符串匹配的文件的数据列

组合来自与bash中的字符串匹配的文件的数据列,bash,Bash,我有一个未知数量的输入文件,所有这些文件都匹配一个搜索字符串,比如*.dat,并且都有两列数据和相等数量的行。在bash中,我需要获取每个文件中的第2列,并将其作为新列附加到单个合并文件中 例如: 以下是我尝试过的代码,我采用的方法是尝试循环和附加: for filename in $(ls *.dat); do paste combined.dat <(awk '{print $2}' $filename) >> combined.dat; done 文件名的,单位为$(l

我有一个未知数量的输入文件,所有这些文件都匹配一个搜索字符串,比如*.dat,并且都有两列数据和相等数量的行。在bash中,我需要获取每个文件中的第2列,并将其作为新列附加到单个合并文件中

例如:

以下是我尝试过的代码,我采用的方法是尝试循环和附加:

for filename in $(ls *.dat); do paste combined.dat <(awk '{print $2}' $filename) >> combined.dat; done
文件名的
,单位为$(ls*.dat);粘贴combined.dat>combined.dat;完成
输出格式可以是任何格式,只要它的制表符是分隔的,关键是它必须处理任意数量的输入文件,最多可达…100个左右,其中数字事先不知道

Awk 由于您已经使用了
awk
,您可以在
awk
中完成整个工作:

rm -f combined.dat
awk 'FNR<NR{d="\t"} {a[FNR]=a[FNR] d $2} END{for(i=1;i<=FNR;i++) print a[i]}' *.dat > combined.dat
使用单个
粘贴

或者,您可以构建一个bash命令并执行它。不用担心,
eval
保存为
printf%q
确保正确的报价

rm -f combined.dat
eval "paste $(printf "<(awk '{printf \$2}' %q) " *.dat) > combined.dat"
rm-f combined.dat
评估“粘贴$(打印”Awk
由于您已经使用了
awk
,您可以在
awk
中完成整个工作:

rm -f combined.dat
awk 'FNR<NR{d="\t"} {a[FNR]=a[FNR] d $2} END{for(i=1;i<=FNR;i++) print a[i]}' *.dat > combined.dat
使用单个
粘贴

或者,您也可以构建一个bash命令并执行它。不用担心,
eval
保存为
printf%q
可以确保正确引用

rm -f combined.dat
eval "paste $(printf "<(awk '{printf \$2}' %q) " *.dat) > combined.dat"
rm-f combined.dat

eval“paste$(printf”短草稿,特别是插入新行和制表符可以优化:

#!/bin/bash
nrLines=$(wc -l < `(ls *dat | head -1)` | xargs)
i=1
while [ ${i} -le ${nrLines} ];
do
    for file in $(ls *dat); do
            awk -v line=${i} 'NR==line {printf $2}' ${file} >> consolidatedreport.txt
            echo -en "\t" >> consolidatedreport.txt
    done
i=$[$i+1]
echo "" >> consolidatedreport.txt
done
!/bin/bash
nrLines=$(wc-l<`(ls*dat|head-1)`xargs)
i=1
而[${i}-le${nrLines}];
做
对于以美元(ls*dat)表示的文件,请执行以下操作
awk-v line=${i}'NR==line{printf$2}'${file}>>consolidatedreport.txt
echo-en“\t”>>consolidatedreport.txt
完成
i=$[$i+1]
echo”“>>consolidatedreport.txt
完成

请注意,根据您将数据输出到新文件的方式以及对现有文件的迭代方式,您可能最终会对新创建的文件进行迭代。因此,如果您对所有以*dat结尾的文件进行迭代,请确保使用除*dat之外的其他结尾(我在示例中使用了txt)或者将生成的文件放在子文件夹中。

简短草稿,特别是插入新行和选项卡可以优化:

#!/bin/bash
nrLines=$(wc -l < `(ls *dat | head -1)` | xargs)
i=1
while [ ${i} -le ${nrLines} ];
do
    for file in $(ls *dat); do
            awk -v line=${i} 'NR==line {printf $2}' ${file} >> consolidatedreport.txt
            echo -en "\t" >> consolidatedreport.txt
    done
i=$[$i+1]
echo "" >> consolidatedreport.txt
done
!/bin/bash
nrLines=$(wc-l<`(ls*dat|head-1)`xargs)
i=1
而[${i}-le${nrLines}];
做
对于以美元(ls*dat)表示的文件,请执行以下操作
awk-v line=${i}'NR==line{printf$2}'${file}>>consolidatedreport.txt
echo-en“\t”>>consolidatedreport.txt
完成
i=$[$i+1]
echo”“>>consolidatedreport.txt
完成
请注意,根据您将数据输出到新文件的方式以及对现有文件的迭代方式,您可能最终会对新创建的文件进行迭代。因此,如果您对所有以*dat结尾的文件进行迭代,请确保使用除*dat之外的其他结尾(我在示例中使用了txt)或者将生成的文件放在子文件夹中。

相关:我在回答中修复了两个错误(仅针对某些系统)。希望现在一切正常。请让我知道其中一个命令是否适用于您。相关:我修复了两个错误(仅针对某些系统)在我的回答中。希望现在一切正常。请让我知道其中一个命令是否对您有效。