для меня в `cat file` типа с 2 переменными и 2 файлами - PullRequest
4 голосов
/ 08 января 2011

у меня есть этот сценарий

for i in `cat file`
do
echo $i
done

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

, чтобы получить

echo $i + $f

Ответы [ 3 ]

3 голосов
/ 08 января 2011

Простое решение с использованием классических оболочек, а не конструкций, специфичных для Bash, использует:

paste file1 file2 |
while read i j
do echo $i and $j
done

Это предполагает, что в данных из файла1 нет пробелов (пробелы в файле2 обрабатываются в любом случае, потому что j получает второе и последующие слова в каждой строке ввода).Если вам нужно беспокоиться об этом, то вы можете поработать с IFS и т. Д .:

paste -d'|' file1 file2 |
while IFS='|' read i j
do echo $i and $j
done
2 голосов
/ 08 января 2011

Вы можете сделать это с помощью следующего скрипта:

#!/usr/bin/bash

state=0
for i in $(paste file1 file2) ; do
    if [[ $state -eq 0 ]] ; then
        state=1
        save=$i
    else
        state=0
        echo $save and $i
    fi
done

С двумя входными файлами:

$ cat file1
1
2
3
4
5

и:

$ cat file2
a
b
c
d
e

вы получитеследующий вывод:

1 and a
2 and b
3 and c
4 and d
5 and e

Этот скрипт использует вставку для создания новой последовательности аргументов, чередующихся между двумя файлами, а затем очень простой конечный автомат для сбора и обработки пар.

Имейте в виду, что это не сработает, если ваши строки содержат пробелы, но я предполагаю, что это не проблема, поскольку ваш оригинальный скрипт тоже не сработал.

1 голос
/ 08 января 2011
while IFS='|' read -r i j; do echo $i and $j; done < <(paste -d '|' file1 file2)

При выборе разделителя, который не отображается в ваших данных, это будет работать, даже если данные содержат пробелы (например).

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