서로 다른 네트워크 폴더의 서로 다른 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

관련 정보