폴더에 다음 파일이 있습니다.
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
이전과 같이 사용합니다.