Цикл печати в 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», имя файла, строки «1 5.732436», значение переменной a, имя файла и 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

Связанный контент