awk는 읽은 파일을 출력합니다.

awk는 읽은 파일을 출력합니다.

아직 들어가보지는 않았지만 awk내년에 배우게 될 내용입니다. 나는 이전에 질문을 했고 이것이 나에게 생각을 갖게 했고 awk효과가 있었습니다. 그러나 모든 파일 형식을 입력하고 출력하는 방법을 잘 모르겠습니다 awk.

  • 모든 .xml파일 찾기
  • 눕다file.xml
  • awk스크립트 실행
  • 다른 이름으로 저장file.xml

awkbash에서 조사해서 찾았습니다 .이것그러나 나는 그것이 현재 awk 코드가 파일로 다시 인쇄하는 문제를 해결할 것이라고 생각하지 않습니다 .xml. 현재 스크립트를 실행하는 것이 제가 해야 할 전부입니다 gawk -f file.sh < file.xml.

내 목표는 모든 .xml파일을 검색하고, 코드를 실행하고, .xml동일한 위치에 새 파일을 저장하는 것입니다.

편집: 몇 번의 검색 후에 이것을 다시 xml로 출력할 수 있었습니다.

gawk -f awk.sh < file.xml > file.xml

답변1

다른 도구를 사용해도 괜찮다면 find이 명령, 특히 -exec 옵션을 살펴보거나 xargs이 명령과 결합해야 합니다. (이것도 살펴보세요 find ... -print0 | xargs -0 ...)

답변2

해결해야 할 몇 가지 문제가 있습니다.

AWK 스크립트에는 디렉터리를 검색할 수 있는 방법이 내장되어 있지 않으므로 최소한 파일 목록이 포함된 AWK 스크립트를 제공해야 합니다. 이는 셸이나 를 통해 수행할 수 있습니다 find. 이 목록을 AWK에 전달하는 방법도 몇 가지 있습니다.

또한 스크립트가 먼저 내용을 성공적으로 처리하고 출력을 임시 파일에 저장하는 경우에만 원본 파일을 덮어쓰도록 주의해야 합니다.

또한 이러한 XML 파일로 무엇을 하려는지 신중하게 고려해야 합니다. XML(및 SGML과 같은 유사한 모든 "언어")의 구문은 구문 분석하기가 매우 어렵습니다.

먼저 마지막 질문부터 시작하여 표준 입력에 제공된 입력 파일을 처리하고 결과를 표준 출력에 쓰는 필터 프로그램이 될 수 있는 간단한 스크립트를 작성한다면 가장 중요한 단계는 다음과 같습니다. 추측한 대로 명령줄에서 파일 리디렉션을 통해 간단히 테스트할 수 있지만 입력 파일을 덮어쓰거나 자르지 않도록 매우 주의해야 합니다.

awk -f script.awk < input_file > output_file

몇 가지 간단한 셸 구문은 스크립트가 성공한 것처럼 출력 파일의 이름을 동일한 이름으로 변경하여 입력 파일을 변환하는 데 도움이 됩니다(따라서 두 번째 문제 해결).

awk -f script.awk < input_file > output_file && mv output_file input_file

이전 명령만 &&실행되고 성공 상태로 종료됩니다(종료 코드는 0.

이제 마침내 대용량 파일 작업의 첫 번째 문제를 해결할 수 있습니다. 파일 목록에 대해 위 명령을 반복하는 가장 쉬운 방법은 한 번에 하나의 파일 이름을 읽고 위 명령을 사용하여 처리하는 간단한 작은 쉘 루프를 사용하는 것입니다.

while read fn; do
    awk -f script.awk < "${fn}" > "${fn}.out" && mv "${fn}.out" "${fn}" || break
done

프로세스가 실패하면 || break루프가 종료되고 실패한 파일에 대한 부분 파일이 남습니다 awk. .out또한 변수 확장을 주의 깊게 인용하십시오. 이렇게 하면 공백이 포함된 파일 이름을 올바르게 처리할 수 있습니다.

물론 이제 while read루프는 사용자가 파일 이름을 입력한 다음 다른 이름을 입력하는 등의 작업을 중단하거나 EOF 문자를 보낼 때까지 기다립니다. 따라서 매우 간단하게 다음과 같은 파일 이름 목록을 제공할 수 있습니다 find.

find . -name '*.xml' -print | while read fn; do

....

이 모든 것을 작은 스크립트로 마무리하거나 명령줄에 입력할 수 있습니다.

작은 쉘 스크립트를 만든 경우 while명령줄 인수 목록을 반복하는 루프를 사용하고 각 인수를 처리할 파일 이름으로 처리할 수도 있습니다. 이를 통해 많은 UNIX 프로그램이 명령줄에 제공된 파일 목록을 처리하는 것처럼 쉘 파일 이름 확장을 사용하여 처리할 파일 목록을 생성할 수 있습니다. 그런 다음 for다음과 같은 루프를 사용할 수 있습니다 .

for fn
do

....

(첫 번째 줄의 변수 이름 뒤에는 세미콜론이 없습니다!)

AWK 스크립트를 수정하여 표준 입력에서 파일 이름 목록을 읽고 system()호출할 수도 있습니다 mv.

관련 정보