많은 파일이 포함된 여러 폴더가 있고 각 폴더에는 동일한 이름의 txt 파일이 있으며 동일한 이름의 파일을 하나의 txt 파일로 병합하고 싶습니다.
예:
folder/
-sub1
-sub2
-sub3
.
.
.
-sub28
각 하위 폴더에는 여러 파일이 있습니다.
EAF001.ID001.txt EAF001.ID002.txt EAF001.ID003.txt EAF001.ID004.txt
EAF001.ID005.txt EAF001.ID006.txt EAF001.ID007.txt EAF001.ID008.txt
EAF001.ID009.txt EAF001.ID010.txt EAF001.ID011.txt EAF001.ID012.txt
EAF001.ID013.txt EAF001.ID014.txt EAF001.ID015.txt EAF001.ID016.txt
같은 이름의 파일을 병합하고 싶습니다.
EAF001.ID001.merge.txt EAF001.ID002.merge.txt EAF001.ID003.merge.txt EAF001.ID004.merge.txt
EAF001.ID005.merge.txt EAF001.ID006.merge.txt EAF001.ID007.merge.txt EAF001.ID008.merge.txt
EAF001.ID009.merge.txt EAF001.ID010.merge.txt EAF001.ID011.merge.txt EAF001.ID012.merge.txt
EAF001.ID013.merge.txt EAF001.ID014.merge.txt EAF001.ID015.merge.txt EAF001.ID016.merge.txt
어떤 도움이라도 대단히 감사하겠습니다.
답변1
export dir='/path/to/folder'
find "$dir" -mindepth 2 -type f -name 'EAF*.txt' \
-exec sh -c 'for f; do
bn=$(basename "$f" .txt);
cat "$f" >> "$dir/$bn.merged.txt";
done' sh {} +
이 -mindepth 2
옵션은 /path/to/folder 디렉터리 자체의 파일을 처리에서 제외하므로(즉, 하위 디렉터리의 파일만 검색) 출력 파일이 이미 존재하는 경우 출력 파일을 자체에 연결하지 않습니다.
중복된 파일 이름이 있는지 여부에 관계없이 "merged.txt" 출력 파일에 파일이 추가됩니다.
중복된 파일 이름만 병합하려는 경우:
typeset -Ax counts # declare $counts to be an exported associative array
export dir='/path/to/folder'
# find out how many there are of each filename
while read -d '' -r f; do
let counts[$f]++;
done < <(find "$dir" -mindepth 2 -type f -name 'EAF*.txt' -print0)
# concatenate only the duplicates
find "$dir" -mindepth 2 -type f -name 'EAF*.txt' \
-exec bash -c 'for f; do
if [ "${counts[$f]}" -gt 1 ]; then
bn=$(basename "$f" .txt);
cat "$f" >> "$dir/$bn.merged.txt";
fi
done' sh {} +
이를 위해서는 bash
연관 배열을 지원하는 다른 쉘(예: POSIX 아님 sh
)이 필요합니다.
답변2
find
txt 파일을 반복하여 중복된 이름을 사용하고 계산할 수 있습니다 wc
. 중복된 이름의 수가 1보다 크면 merge.txt 파일에 추가됩니다.
#!/bin/bash
output_dir="output"
rm -rf "$output_dir"
mkdir "$output_dir"
for file in */*.txt; do
file_name=$(basename "$file" .txt)
duplicate_names_count=$(find . -type f -name "$file_name.txt" | wc -l)
if [ "$duplicate_names_count" -gt 1 ]; then
cat "$file" >> "$output_dir/${file_name}.merge.txt"
fi
done