이것을 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
사용하여 이 작업을 수행하십시오 ( 이와 같은 루프 호출은 느리고 불필요합니다).awk
awk
awk 'FNR == 2 {
printf "python2 script.py %s 1 5.732436 %s f%s n\n", FILENAME, $1, FILENAME
}' *.b
이는 awk
모든 .b
파일을 입력으로 호출합니다. 각 파일의 두 번째 라인에 대해 현재 입력 파일의 첫 번째 필드에서 데이터를 가져와 원하는 출력을 표준 출력으로 인쇄합니다.
FILENAME
awk
현재 입력 파일의 이름을 포함하는 특수 변수입니다 . 마찬가지로 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