복잡한 이름 패턴과 일치하는 파일을 찾고 결합하는 명령

복잡한 이름 패턴과 일치하는 파일을 찾고 결합하는 명령

내 Linux 디렉터리에는 파일 덤프가 포함되어 있으며 다음과 같습니다.

EDW_Infile_ABC_Daily_Activity_20190204.csv
EDW_Infile_ABC_Daily_Activity.zip
EDW_Infile_PQRInc_Daily_Activity_20190204.csv
EDW_Infile_PQRInc_Daily_Activity_zip
EDW_Infile_ABC_Daily_Payment_20190204.csv
EDW_Infile_PQRInc_Daily_Payment_20190204.csv
EDW_Infile_ABC_Daily_Status_20190204.csv
EDW_Infile_PQRInc_Daily_Status_20190204.csv

이러한 파일은 다음과 같은 몇 가지 일반적인 이름 패턴을 따릅니다.

EDW_Infile_*<3 to 8 bytes company name>*_Daily_Activity_*YYYYMMDD*.csv
EDW_Infile_*<3 to 8 bytes company name>*_Daily_Payment_*YYYYMMDD*.csv
EDW_Infile_*<3 to 8 bytes company name>*_Daily_Status_*YYYYMMDD*.csv

내가 어떻게 -

1) EDW_Infile_ 패턴에 따라 모든 고객, 모든 날짜에 대한 모든 파일을 찾습니다.{3~8바이트의 이름}_일상 생활_{모든 날짜}.csv

2) 각 파일에는 헤더가 포함되어 있습니다. 모두 하나의 파일로 병합하고 헤더가 하나만 있는 방법

답변1

파일 이름을 제어할 수 없고 비슷한 파일 이름이 있고 와일드카드를 EDQ_Infile_some uninteresting stuff here_Daily_Activity_junk here.csv사용하고 싶지 않은 경우를 대비해 좀 더 구체적으로 답변하기 위해 내 zsh 지식을 조금 다루고 있습니다.*

파일 이름 목록을 수집하려면...

EDW_Infile_{3~8바이트의 모든 이름}_Daily_Activity_{모든 날짜}.csv 패턴을 따릅니다.

zsh에서 이 Extended_glob 모드를 설정하겠습니다(입력하지 마세요 $. 이것은 쉘 프롬프트입니다).

$ set -o extended_glob
$ files=(EDW_Infile_?(#c3,8)_Daily_Activity_[[:digit:]](#c8).csv)

일반 텍스트 외에도 모드는 다음과 같습니다.

  • ?-- 임의의 (단일) 문자
  • (#c3,8)-- 3~8자(포함)가 필요합니다.
  • [[:digit:]]-- 숫자가 필요합니다
  • (#c8)--8개 필요

목록을 확인하세요:

$ print -l $files
EDW_Infile_ABC_Daily_Activity_20190204.csv
EDW_Infile_PQRInc_Daily_Activity_20190204.csv

그때까지...

모두 하나의 파일로 병합하고 헤더가 하나만 있습니다.

{ head -1 "${files[1]}"; for f in $files; do sed 1d "$f"; done; } > output.csv

이는 두 개의 명령을 그룹화하고 해당 출력을 로 리디렉션합니다 output.csv. 첫 번째 명령은 head배열의 첫 번째 파일에서 첫 번째 줄을 가져온 다음 모든 파일을 반복하고 첫 번째 줄을 삭제합니다(기본값은 나머지를 표준 출력으로 인쇄). .

답변2

당신은 이런 것을 원할 수도 있습니다

# collect all the "EDW_Infile_ABC" prefixes
declare -A prefix
for f in EDQ_Infile_*_Daily_Activity_*.csv; do
    p=${f%_*.csv}
    prefix[$p]=1
done

for p in "${!prefixes[@]}"; do
    awk 'NR==1 {print} FNR==1{next} {print}' "$p"_*.csv > "$p"_all.csv
    zip "$p".zip "$p"_all.csv
    rm  "$p"_all.csv
done

Bash의 경우 연관 배열에는 버전 4가 필요합니다. 그렇지 않으면 위치 매개변수를 사용할 수 있습니다.

관련 정보