"=============="와 같은 구분 기호와 빈 새 줄을 추가하고 싶습니다.
이 작업을 시도했지만 실패하고 CPU 사용량이 높아졌습니다. 즉, 스크립트를 실행하면 CPU가 매우 빠르게 회전하고 소음이 많이 납니다.
이는 약 100,000개의 텍스트 파일에 필요합니다.
이것은 내가 사용하는 코드입니다
#!/bin/bash
for F in *.txt ; do
type "$F"
echo .
echo ========
echo .
done >> Combined.txt;
조언해주세요
답변1
다음과 같이 명령을 단순화하겠습니다.
#!/bin/bash
for file in *.txt; do
cat $file >> Combined.txt
printf '\n\n=========\n\n' >> Combined.txt
done
답변2
수천 개의 파일에 대해 이 작업을 수행하는 경우 파일당 여러 명령을 실행하지 않는 것이 좋습니다. GNU 사용 awk
:
printf '%s\0' ./*.txt | xargs -r0 gawk '
BEGINFILE {if (NR) print "\n==========\n"};1' > combined.out
출력 파일을 동일한 디렉터리에 저장하는 경우 .txt
확장자를 지정하지 마세요. 그렇지 않으면 입력 파일로 선택되어 무한 루프가 발생합니다(아마도 처음에 문제가 발생한 것 같습니다).
또는 내장 셸을 사용하세요 . cat
예를 들면 다음과 같습니다 .ksh93
#! /bin/ksh93 -
firstpass=true
for file in *.txt; do
"$firstpass" || print '\n===========\n'
firstpass=false
command /opt/ast/bin/cat < "$file"
done > combined.out
루프의 이러한 모든 명령은 내장되어 있으므로 이를 실행해도 새 프로세스를 포크하거나 외부 실행 파일을 로드하는 작업이 포함되지 않으므로 성능이 허용 가능해집니다.
답변3
사용 FNR
및NR
awk
#!/bin/bash
outfile="$( mktemp combined.txt.XXXXXX )"
echo "Output file: ${outfile}"
awk 'FNR==1 && NR>1 { printf("\n%s\n\n","========") } 1' *.txt > "${outfile}"
echo "Finished."
한 줄씩 설명:
outfile="$( mktemp combined.txt.XXXXXX )"
mktemp
고유한 이름(예:)을 가진 빈 새 파일을 만드는 데 사용됩니다 combined.txt.HDpgMn
. 더 많은 문자를 사용하여 X
더 긴 임의 접미사를 얻을 수 있습니다. 새 파일의 이름을 변수에 저장하려면 명령을 "$(
... 로 묶습니다 .)"
outfile
echo "Saving to file: ${outfile}"
인쇄물 파일의 이름입니다. (스크립트가 완료된 후 출력 파일의 이름을 바꾸어 뒤에 있는 임의의 문자열을 제거할 수 있습니다. .txt
)
awk 'FNR==1 && NR>1 { printf("\n%s\n\n","========") } 1' *.txt > "${outfile}"
인쇄...
- 빈 줄,
- "=" 문자로 구성된 작은 줄,
- 그리고 또 다른 빈 줄
...첫 번째 파일을 제외한 각 입력 파일의 시작 부분에 있습니다. FNR
입력 파일의 줄 수를 계산하고 각 파일의 시작 부분에서 재설정합니다. NR
줄 번호는 계산되며 재설정되지 않습니다.
이 awk
명령문 에서 1
오른쪽 작은따옴표 앞의 각 줄 TRUE
은 로 평가되고 해당 줄을 인쇄하는 기본 작업을 수행합니다. (즉, awk '1'
이렇게 작동합니다 cat
.)
echo "Finished."
스크립트가 완료되면 사용자에게 알립니다. (어쨌든 명령 프롬프트가 표시되므로 꼭 필요한 것은 아니지만, 나쁠 것은 없습니다.)
답변4
왜 간단하지 않은가?
printf "\n\n=====\n\n" > XTMP
cat $(printf "%s XTMP " *.txt) > combined.tmp
구분 기호를 임시 파일에 넣고 printf
찾은 각 매개 변수에 대해 형식 문자열을 반복하는 기능을 활용하면 cat
명령이 다음과 같이 표시됩니다 .
cat 1.txt XTMP 2.txt XTMP ... n.txt XTMP
그러나 시스템 제한(예: LINE_MAX)이 발생할 수 있습니다...