사용 FNR및NR​awk

사용 FNR및NR​awk

"=============="와 같은 구분 기호와 빈 새 줄을 추가하고 싶습니다.

이 작업을 시도했지만 실패하고 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

사용 FNRNRawk

#!/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)이 발생할 수 있습니다...

관련 정보