異なるネットワークフォルダ内の異なる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 *ファイルも結合したいと思います。私の出力には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

また、使用を検討する必要がありますfind。 - もう一つの非常に便利な方法です。たとえば、次のようになります。

find . -name "*csv" -exec grep "" {} + | sed -e 's/:/,/g' -e 's/\.\///g'

これはここで説明されている問題と非常によく似ています。 複数のCSVファイルの各行にあるCSVファイル内のファイル名を関連付けます。

また見なさい:

https://stackoverflow.com/questions/12554698/display-content-of-all-files-with-their-filenames-with-cat

https://stackoverflow.com/questions/5917413/cat-multiple-files-but-include-filename-as-headers

https://stackoverflow.com/questions/864316/how-to-pipe-list-of-files-returned-by-find-command-to-cat-to-view-all-the-files

答え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

関連情報