아래와 같이 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