Как добавить строку в текстовый файл - PullRequest
1 голос
/ 27 января 2020

data.txt

height= 6'1" age= shoe-size=9.5 sex= M
height= 6'5" age= shoe-size=9.0 sex= M
height= 5'11" age= shoe-size=8.5 sex= F
height= 5'9" age= shoe-size=11.5 sex= M
height= 4'11" age= shoe-size=7.5 sex= F
height= 6'4" age= shoe-size=9.5 sex= M

age.txt

21
23
22
19
34
27

Как получить информацию из age.txt и поместите его в data.txt, поместив каждое число, следующее за другим, в возрастную часть data.txt?

Есть ли способ сделать для l oop количество строк в моем файле и затем ищите «возраст» и каждый раз, когда я вижу возраст, заменяйте его на число в age.txt

Ожидаемый результат

height= 6'1" age=21 shoe-size=9.5 sex= M
height= 6'5" age=23 shoe-size=9.0 sex= M
height= 5'11" age=22 shoe-size=8.5 sex= F
height= 5'9" age=19 shoe-size=11.5 sex= M
height= 4'11" age=34 shoe-size=7.5 sex= F
height= 6'4" age=27 shoe-size=9.5 sex= M

Ответы [ 3 ]

3 голосов
/ 27 января 2020

Использование индексных массивов bash4.

mapfile -t data < data.txt
mapfile -t age <age.txt

for i in "${!data[@]}"; do echo "${data[$i]//age=/age="${age[$i]}"}"; done

Вывод такой.

height= 6'1" age=21 shoe-size=9.5 sex= M
height= 6'5" age=23 shoe-size=9.0 sex= M
height= 5'11" age=22 shoe-size=8.5 sex= F
height= 5'9" age=19 shoe-size=11.5 sex= M
height= 4'11" age=34 shoe-size=7.5 sex= F
height= 6'4" age=27 shoe-size=9.5 sex= M

mapfile aka readarray - это функция bash4 +.

${!data[@]} означает, что вы ищете индекс массива и ${data[@]} это массив.

Или используя while loop и read read, так что в основном это просто чтение двух файлов за некоторое время .

height= 6'1" age=21 shoe-size=9.5 sex= M
height= 6'5" age=23 shoe-size=9.0 sex= M
height= 5'11" age=22 shoe-size=8.5 sex= F
height= 5'9" age=19 shoe-size=11.5 sex= M
height= 4'11" age=34 shoe-size=7.5 sex= F
height= 6'4" age=27 shoe-size=9.5 sex= M

POSIX sh решение.

#!/bin/sh

while read -r column1_in_data column2_in_data column3_in_data rest_of_columns_in_data <&3
  read -r line_in_age; do
  printf '%s\n' "$column1_in_data $column2_in_data $column3_in_data$line_in_age $rest_of_columns_in_data"
done 3<data.txt <age.txt

* <&3 - это перенаправление, поэтому первое чтение будет считываться из FD (дескриптор файла 3.)

${var//search/rep} - это bash спецификация c PE (расширение параметра.)

Awk может работать лучше / быстрее на большом наборе файлов / данных, которые я считаю.

2 голосов
/ 27 января 2020

Использование awk и getline обеспечивает очень простое и эффективное решение, например,

awk '{getline age < "age.txt"; $3=$3 age}1' data.txt

Выше вы просто используете getline для чтения из age.txt в переменную age и затем добавьте age в поле 3 rd из data.txt.

Другой путь, если "age=" появляется только один раз в строке, будет:

awk '{getline age < "age.txt"; sub(/age=/,"age=" age)}1' data.txt

Пример использования / Вывод

Вы можете просто скопировать и вставить среднюю мышь в xterm в каталоге, где находятся ваши файлы, например,

$ awk '{getline age < "age.txt"; $3=$3 age}1' data.txt
height= 6'1" age=21 shoe-size=9.5 sex= M
height= 6'5" age=23 shoe-size=9.0 sex= M
height= 5'11" age=22 shoe-size=8.5 sex= F
height= 5'9" age=19 shoe-size=11.5 sex= M
height= 4'11" age=34 shoe-size=7.5 sex= F
height= 6'4" age=27 shoe-size=9.5 sex= M
1 голос
/ 27 января 2020

Вы можете сделать это с помощью набора cut и paste и подстановки процесса:

paste -d ' ' \
    <(paste -d'\0'  \
        <(cut -d' ' -f-3 data.txt) \
        age.txt) \
    <(cut -d' ' -f4- data.txt)

Внешняя команда paste использует пробел в качестве разделителя для вставки вывода внутреннего paste и внешний cut вместе.

Внутренний paste использует нулевой разделитель, поэтому между age= и значением возраста не должно быть пробела.

При этом, формат входного файла кажется несовместимым с интервалом вокруг =.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...