Bash에서 루프 인쇄

Bash에서 루프 인쇄

Bash에서 이것을 어떻게 인쇄할 수 있나요?

for file in *.b; do
  a="$(awk 'NR==2{print $1}' "$file")"
  printf ('python2 script.py' $file '1 5.732436' $a "f$file" 'n')
done

문자열 "python2 script.py", 파일 이름, 변수 a의 문자열 "1 5.732436" 값, 파일 이름과 이전 f, 문자열 n을 인쇄하고 싶습니다.

원하는 출력(파일이 포함된 디렉터리의 경우: file1.b, file2.b, file3.b:

python2 script.py file1.b 1 5.732436 5.5 ffile1.b n
python2 script.py file2.b 1 5.732436 3.2 ffile2.b n
python2 script.py file3.b 1 5.732436 1.2 ffile3.b n

답변1

이미 this 를 사용하고 있으므로 awkawk루프에서 이 작업을 수행하는 대신( awk이와 같은 루프 호출은 느리고 불필요합니다):

awk 'FNR == 2 { 
    printf "python2 script.py %s 1 5.732436 %s f%s n\n", FILENAME, $1, FILENAME
}' *.b

그러면 awk모든 파일이 입력으로 .b호출 됩니다. 각 파일의 두 번째 줄에서는 원하는 출력을 표준 출력으로 인쇄하고 현재 입력 파일의 첫 번째 필드에서 데이터를 가져옵니다.

FILENAMEawk현재 입력 파일의 이름을 포함하는 특수 변수입니다 . 이번에도 는 FNR현재 파일의 현재 레코드 번호(줄 번호)입니다.

GNU(아마도 Linux 시스템)를 사용하고 있고 파일이 매우 큰 경우 awk인쇄 후 호출하여 작업 속도를 높일 수 있습니다. nextfile현재 파일에서 더 이상 읽지 않고 즉시 다음 입력 파일로 이동합니다.

awk 'FNR == 2 { 
    printf "python2 script.py %s 1 5.732436 %s f%s n\n", FILENAME, $1, FILENAME
    nextfile
}' *.b

nextfile또한 지원됩니다 mawk.

답변2

이 시도

awk 'FNR==2 {print ("python2 script.py " FILENAME " 1 5.732436 " $1 " f" FILENAME " n")}' *.b

관련 정보