동일한 awk 작업을 다른 파일에 적용하는 방법은 무엇입니까?

동일한 awk 작업을 다른 파일에 적용하는 방법은 무엇입니까?

저는 awk를 처음 접했는데 이 작업을 수행하기 위해 awk 스크립트를 작성할 수 있는지 모르겠습니다.

정렬해야 할 데이터 파일이 수백 개 있습니다. 각각에 대해 다음 줄을 사용합니다.

awk 'ORS=NR%3?" ":"\n" ' file1.tex >  file1_sorted.tex
awk 'ORS=NR%3?" ":"\n" ' file2.tex >  file2_sorted.tex
...

필요한 결과를 얻습니다. 그러나 나는 이 작업을 자동으로 수행하고, 각 파일을 가져오고, 작업을 적용하고, 해당 정렬된 파일을 작성하는 스크립트를 갖고 싶습니다.

귀하의 도움에 감사드립니다!

답변1

for 루프에 다음 파일을 적용할 수 있습니다.

for file in *.tex;
do
    awk 'ORS=NR%3?" ":"\n"' "$file" > "$(basename "$file")_sorted.tex"
done

또는 한 줄로:

for file in *.tex; do awk 'ORS=NR%3?" ":"\n"' $file > "$(basename "$file" .tex)_sorted.tex"; done

어떤 쉘을 지정하지 않았으므로 basename쉘별 구문을 사용하는 대신 보다 표준적인 쉘을 사용하십시오 ${file%%.tex}.

답변2

awk코드를 수정하면 awk셸 루프 없이 단일 프로세스로 문제를 해결할 수 있습니다.

awk 'FNR==1{if(o)close(o);o=FILENAME;sub(/\.tex/,"_sorted.tex",o)}{ORS=FNR%3?" ":"\n";print>o}' *.tex

예쁘지는 않아요. 조금 더 빨라졌을 뿐입니다.

설명하다댓글에서 요청한대로.

FNR(에프엘리N숫자 또는아르 자형에코)는 NR(N숫자 또는아르 자형ecord), 그러나 NR모든 입력 레코드에 대한 순차적 시퀀스 번호인 반면 FNR새 입력 파일 처리가 시작되면 1로 재설정됩니다.

4.0의 유일한 gawk대안 은 특수 모드 FNR==1입니다 .BEGINFILE

awk '
FNR==1{   # first record of an input file?
  if(o)close(o);   # was previous output file? close it
  o=FILENAME;sub(/\.tex/,"_sorted.tex",o)   # new output file name
}
{
  ORS=FNR%3?" ":"\n";   # set ORS based on FNR (not NR as in the original code)
  print>o   # print to the current output file
}
' *.tex

답변3

오래된 질문입니다. 제가 싱글 코어 PC를 마지막으로 본 것이 10년 전이라는 점을 고려하면 GNU 병렬을 사용할 수 있습니다.

쉘 인용 부호 확장 및 해석 해결

my_awk='ORS=NR%3?" ":"\n"' 

올바른 글로브를 사용하여 입력 파일을 선택하십시오. 여기서는 {.} 나중에 추가할 것이므로 출력 이름에서 확장자를 제거하는 데 사용합니다.

parallel -jX "awk '$my_awk' {} > {.}_sorted.tex" ::: *.tex

X사용하려는 프로세서 수는 어디에 있습니까? 여전히 1을 사용할 수 있습니다. 이것은 당신에게 file[1-9]_sorted.tex출력을 줄 것입니다

관련 정보