같은 이름으로 시작하는 파일을 병합하고 싶습니다.

같은 이름으로 시작하는 파일을 병합하고 싶습니다.

아래와 같이 100개가 넘는 파일이 여러 개 있는데, 이름이 같은 파일들을 합쳐서 하나의 파일로 병합해야 합니다.

AB_HCE_USERS_20221228_001.txt
AB_HCE_USERS_20221228_002.txt
AB_HCE_TASKS_20221228_001.txt
AB_HCE_TASKS_20221228_002.txt
AB_HCE_TASKS_20221228_003.txt
AB_HCE_ASSESSMENTS_20221228_001.txt
AB_HCE_ASSESSMENTS_20221228_002.txt
AB_HCE_CONTACT_20221228_003.txt
AB_HCE_CONTACT_20221228_004.txt
AB_HCE_CONSUMERS_20221228_001.txt
AB_HCE_VERIFICATION_20221228_001.txt
AB_HCE_VERIFICATION_20221228_002.txt
AB_HCE_CONSUMER_RELATIONSHIP_20221228_001.txt
AB_HCE_CONSUMER_RELATIONSHIP_20221228_002.txt
...

원하는 출력:

AB_HCE_USERS_20221228.txt
AB_HCE_TASKS_20221228.txt
AB_HCE_ASSESSMENTS_20221228.txt
AB_HCE_CONTACT_20221228.txt
AB_HCE_CONSUMERS_20221228.txt
AB_HCE_VERIFICATION_20221228.txt
AB_HCE_CONSUMER_RELATIONSHIP_20221228.txt
..

답변1

그리고 awk:

#!/bin/bash

for file in AB*.txt; do
    awk -F'_[0-9]+.txt$' '{
        system("cat "$0" >> ("$1".txt"));
        close($1".txt")
    }' <<< "$file"
done

답변2

그리고 gawk:

gawk '
  BEGINFILE {out = FILENAME; sub(/_[^_]*$/, ".txt", out)}
  {print > out}' ./*_[[:digit:]][[:digit:]][[:digit:]].txt

이렇게 하면 줄 구분 기호가 없는 줄에 줄 구분 기호가 추가됩니다. 이를 방지하려면 print로 바꾸십시오 . printf "%s", $0 RT특정 파일의 소스 파일이 모두 비어 있으면 해당 출력 파일이 생성되거나 잘리지 않습니다. 이 문제를 해결하기 위해 printf "" > out선언에 하나를 추가 할 수 있습니다 .BEGINFILE

zsh위의 제한 없이 000~999의 숫자로 제한되지 않고 를 사용하세요 ( n파일 이름이 숫자로 정렬되도록 하려면 glob 한정자를 사용하세요).

typeset -A map=()
for f (*_<->.txt(NDn.)) map[${f%_*}]+=$f$'\0'
for out files (${(kv)map}) cat -- ${(0)files} > $out.txt

답변3

Bash의 단순 모드:

for i in AB_*; do
    cat $i >> ${i%_*}.txt
done

충돌 가능성을 피하려면 새 파일에 대해 별도의 디렉터리를 만드는 것이 좋습니다. cat $i >> my_dir/${i%_*}.txt마스크를 다음과 같이 변경할 수도 있습니다.for i in AB_*_[0-9][0-9][0-9].txt

관련 정보