하위 폴더에 있는 여러 CSV 파일을 하나의 고유한 파일로 병합하고 새 열에 파일 이름을 추가합니다.

하위 폴더에 있는 여러 CSV 파일을 하나의 고유한 파일로 병합하고 새 열에 파일 이름을 추가합니다.

많은 하위 폴더에 여러 개의 CSV 파일이 있습니다(상위 디렉터리에 하위 폴더가 1개만 있고 더 이상 중첩되지 않음).

각 CSV 파일에는 세 개의 열이 있습니다. i, k, v에는 문자열과 숫자 값이 혼합되어 있습니다.
구분 기호는 입니다 ;.
때로는 ';'이 문자열의 일부입니다. 그렇다면 백슬래시를 사용하여 이스케이프 처리하세요 \;.

단일 파일의 샘플 콘텐츠 subfoler1/file001.csv;

index,key,value
0,Contact,mailto:[email protected]\;
1,IDG,"44.1\,80.1"
2,Information,https://www.sys.admin.org/\;

파일 이름을 새 열에 추가하면서 이를 고유한 CSV 파일로 병합하고 싶습니다. "파일 이름"이라고 가정하겠습니다.

index,key,value,filename
0,Contact,mailto:[email protected]\;subfolder1/file001.csv
1,IDG,"44.1\,80.1"subfolder1/file001.csv
2,Information,https://www.sys.admin.org/\;subfolder1/file001.csv
0,Contacts,mailto:[email protected]\;subfolder2/file002.csv
1,IDG,"5.2\,7.4";subfolder2/file002.csv

작업이 더 쉬워지면 마지막 열의 폴더 이름을 건너뛰고 파일 이름만 가져오면 됩니다.

나는 과거에 이런 일을 한 적이 있었습니다.

awk '{print $0";"FILENAME}' .*.csv > merged.csv

그러나 파일은 단일 폴더에 있어야 하며 여러 하위 폴더에 분산될 수 없습니다.

원하는 결과를 얻으려면 이 명령을 어떻게 수정해야 합니까?

답변1

테스트되지 않음:

awk -v OFS=';' '
    NR == 1 { print $0, "filename" }
    FNR > 1 { print $0, FILENAME }
' */*.csv

이는 첫 번째 파일의 헤더 줄만 인쇄합니다.

관련 정보