如何组合来自不同网络文件夹的不同 csv 文件,并将每个文件的名称作为组合文件中的列名称?

如何组合来自不同网络文件夹的不同 csv 文件,并将每个文件的名称作为组合文件中的列名称?

我有一堆目录,其中有 3 个具有不同名称的 .csv 文件。例如,在我的目录 aa bb cc dd 中,每个目录有 3 个文件:

aa:  EA_sing_aa.csv    EA_ska_aa.csv   EA_tat_aa.csv
bb:  EA_sing_bb.csv    EA_ska_bb.csv   EA_tat_bb.csv
cc:  EA_sing_cc.csv    EA_ska_cc.csv   EA_tat_cc.csv
dd:  EA_sing_dd.csv    EA_ska_dd.csv   EA_tat_dd.csv

我想将每个文件的名称添加到新列中作为每个文件的行名称,然后将所有 EA_sing*.csv 文件组合在一起,将所有 EA_ska*.csv 文件组合在一起,还将所有 EA_tat*.csv 文件组合在一起!我的输出只有 3 个文件:

1) EA_sing.csv  ##the first column for the rows from EA_sing_aa.csv file
                will be aa and for the rows from EA_sing_bb.csv will be bb
                and for the rows from EA_sing_cc.csv will be cc..... ##   
2) EA_ska.csv
3) EA-tat.csv

我怎样才能在 *nix 中做到这一点?谢谢

答案1

这是一个即兴回答:

for dir in $(ls ); do echo " $dir - this is the directory"; for csv in $(ls $dir/*csv); do cat $csv|sed -e "s/\(.*\)/$dir, \1/g"; done;  done

然后您可以添加选项来指定文件名,例如

for myfile in EA_sing EA_ska EA-tat; do for csv in $(ls $dir/$myfile*)...

然后将它们通过管道传输到您选择的文件,例如

do cat $csv|sed -e "s/\(.*\)/$dir, \1/g" >> $(echo "$myfile_complete.csv")

然后可能会合并成这样的东西:

for dir in aa bb cc dd; do for file in EA_sing EA_ska EA_tat; do for myfile in $(ls $dir/$file*);do echo "parsing $myfile"; cat $myfile | sed -e "s/\(.*\)/$dir,\1/g" >> $(echo "$file\_combined.csv"); done; done; done

或者更重要的是:

for dir in $(ls -d */); do for file in $(ls $dir*csv); do echo "this is my file $file"; cat $file|sed -e "s|\(.*\)|$(echo $dir|sed -e 's/\///g'), \1|g";done; done

答案2

答案3

依赖文件名始终正确

for t in $(find . -iname "*.csv" | awk -F_ '{print $2}' | sort | uniq); do 
    awk -v OFS="," 'split(FILENAME,f,/[_.]/){print $0,f[4]}' $(find . -iname "*$t*.csv" | sort) > EA_$t.csv
done

相关内容