파일 이름의 첫 번째 문자를 기준으로 파일 연결

파일 이름의 첫 번째 문자를 기준으로 파일 연결

폴더에 다음 파일이 있습니다.

COUNTRY_US_20200401.TXT
COUNTRY_GB_20200401.TXT
COUNTRY_FR_20100328.TXT
COUNTRY_US_20200406.TXT
COUNTRY_GB_20200410.TXT

처음 10자를 확인하고 파일 이름이 일치하면 아래와 같이 파일을 연결하고 싶습니다 COUNTRY_US.TXT( 병합 COUNTRY_US_20200401.TXT됩니다 COUNTRY_US_20200406.TXT).

COUNTRY_GB.TXT
COUNTRY_FR.TXT

파일 이름을 하드코딩하면 작동하지만 문제는 COUNTRY_GR_20200319.TXT내일 특정 이름의 새 파일이 도착할 경우 파일을 병합하는 방법이며 마지막에 개별 파일을 삭제하려는 경우입니다.

답변1

rm -f COUNTRY_??.TXT
for file in COUNTRY_??_*.TXT; do
    cat "$file" >>"${file%_*.TXT}.TXT"
done

먼저 병합된 파일이 없는지 확인합니다. 우리는 항상추가의병합된 파일에 추가되므로 해당 파일이 이미 존재하는 경우 코드를 여러 번 실행하면 결과 파일의 데이터가 중복될 수 있습니다.

그런 다음 이 파일을 반복합니다. 우리는 모든 파일이 패턴 COUNTRY_??_*.TXT(질문에 나오는 이름)과 일치한다고 가정합니다. 각 파일에 대해 cat해당 병합 파일의 끝에 데이터를 추가하기만 하면 됩니다. 병합된 파일의 이름은 먼저 _*.TXT파일 이름에서 일치하는 가장 짧은 접미사 문자열을 제거한 다음 이를 끝에 다시 추가하여 .TXT얻습니다 .

이것을 테스트해 보세요:

$ ls
COUNTRY_FR_20100328.TXT   COUNTRY_GB_20200410.TXT   COUNTRY_US_20200406.TXT
COUNTRY_GB_20200401.TXT   COUNTRY_US_20200401.TXT

(여기서 루프가 실행됩니다)

$ ls
COUNTRY_FR.TXT            COUNTRY_GB_20200401.TXT   COUNTRY_US_20200401.TXT
COUNTRY_FR_20100328.TXT   COUNTRY_GB_20200410.TXT   COUNTRY_US_20200406.TXT
COUNTRY_GB.TXT            COUNTRY_US.TXT

각각의 새 파일은 이름에 날짜가 포함된 해당 파일을 연결한 것입니다.


주석에 추가 요구 사항이 추가되었습니다. 첫 번째 병합 파일을 제외한 모든 파일에서 헤더를 제거합니다.

rm -f COUNTRY_??.TXT
for file in COUNTRY_??_*.TXT; do
    outfile=${file%_*.TXT}.TXT
    if [ -s "$outfile" ]; then
        sed 1d "$file"
    else
        cat "$file"
    fi >>"$outfile"
done

즉, 출력 파일이 존재하고 크기가 0보다 큰 경우 현재 파일에서 첫 번째 줄을 제거하고 sed, 그렇지 않으면 cat이전과 같이 사용합니다.

관련 정보