перебирать файл и отправлять строки как позиционные параметры в другой файл

перебирать файл и отправлять строки как позиционные параметры в другой файл

Я хотел бы выполнить итерацию по файлу, содержащему даты (с именем dates.txt) в следующем формате:

2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14

И передайте каждое поле каждой строки как позиционный параметр другому скрипту.

т.е. другой скрипт выполняется путем помещения в командную строку следующего:

$ . the_script 2009 08 03 08 09

я пыталсяfor i in $(./dates.txt);do echo ${i};done

но получите:

./dates: line 1: 2009: command not found
./dates: line 2: 2009: command not found
./dates: line 3: 2009: command not found
./dates: line 4: 2009: command not found
./dates: line 5: 2009: command not found
./dates: line 6: 2009: command not found

из этого я могу сказать, что он работает по каждой строке, но, возможно, зацикливается на каждом поле?

Из-за вышесказанного я пока не смог разобраться, как передать прочитанные строки в качестве позиционных параметров в другой скрипт. Не уверен, где это сделать? Помогите, пожалуйста!

решение1

Возможно, вы имеете в виду что-то вроде этого?

while read -d $'\n' i; do echo $i;done <./dates

while read -d $'\n' i; do . the_script $i;done <./dates

решение2

Если поиск ( .) не нужен, то это похоже на работу дляxargs:

xargs -a dates.txt -rL1 the_script
  • xargsсчитывает строку ввода и затем использует ее для аргументов указанной команды. Разделителем строк по умолчанию является символ новой строки.
  • Мы можем передавать ему данные из других команд или указывать входной файл с помощью -a.
  • Поскольку для каждого вызова скрипта должна использоваться только одна строка, мы указываем параметры -r(не запускать, если строка пуста) и -L(использовать не более N строк для каждого вызова).

решение3

Используйте catв своей команде и убедитесь, что вы используете правильный путь к имени файла, если скрипты не находятся в одном каталоге. Если список находится, dates.txtто используйте $(cat ./dates.txt).Исправлена ​​опечатка здесь. Включите .txt

Вот пример:

Список дат, названных dates.txt.

2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14

Скрипт, названный так lstdates.sh, чтобы отражать названия планет в этом списке.Отредактировано Это выполняется в подоболочке внутреннего разделителя полей (IFS)1не изменяется за пределами подоболочки2.

#!/bin/bash
# Listing each date as an argument for `the_script`.

# Parenthesis runs in a subshell    
( 
  # IFS line break
  IFS=$'\012'
  for dates in $(cat ./dates.txt)
  do
    echo $(./the_script $dates)
  done
)

По умолчанию IFS распознает каждый пробел как конец поля. IFS=$'\012'распознает каждую новую строку как конец поля. Если каждая строка заключена в двойные кавычки, например "2009 08 03 08 09", то будет работать IFS по умолчанию.

the_scriptсодержит только следующее.

#!/bin/bash
echo $1

Ссылка:Расширенное руководство по написанию сценариев Bash, Глава 11. Циклы и ветви

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