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

이미 를 사용하고 있으므로 쉘 루프 대신 를 awk사용하여 이 작업을 수행하십시오 ( 이와 같은 루프 호출은 느리고 불필요합니다).awkawk

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를 사용하고 있고 awk(Linux 시스템에서) 파일이 매우 큰 경우 인쇄 후 호출하여 작업 속도를 약간 높일 수 있습니다 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

관련 정보