Сценарии оболочки Unix: присвойте значение из файла переменной в цикл while и используйте это значение вне цикла - PullRequest
1 голос
/ 29 ноября 2010

Я пишу сценарий оболочки, где мне нужно извлечь содержимое файла, который имеет тип:

type1 | valueA
type2 | valueB
type1 | valueC
type2 | valueD
type3 | valueE
....
typen | valueZ.

Для каждого типа в column_1 у меня есть целевая переменная, которая объединяет значения того же типа, чтобы получить такой результат:

var1 =valueA, valueC
var2 = valueB, valueD
var3 = valueE
.....

Сценарий реализует что-то вроде этого:

var1="HELLO"  
var2="WORLD"  
...  
cat $file | while read record; do  
   #estract column_1 and column_2 from $record    
if [ $column_1 = "tipo1" ]; then  
   var1="$var1, column_2"  ## column_2 = valueB
elif ....  
....  
fi  
done

Нокогда я пытаюсь использовать значение любой из переменных, где я прикован цепью column_2:

    echo "$var1 - $var2"   

, я получаю исходные значения:

    HELLO - WORLD.    

В интернете я читаю, чтопроблема связана с тем, что конвейер создает подоболочку, в которую копируются фактические значения.

Есть ли способ решить эту проблему !?

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

Ответы [ 4 ]

3 голосов
/ 29 ноября 2010

Вам не нужно использовать cat.Проникновение чего-либо в while создает подоболочку.При выходе из подоболочки значения переменных, установленные в цикле, теряются (как и при изменении каталога с использованием cd в качестве другого примера. Вместо этого вам следует перенаправить файл в done:

while condition
do
    # do some stuff
done < inputfile

Кстати, вместо:

while read record

вы можете сделать:

while IFS='|' read -r column1 column2
0 голосов
/ 17 января 2014

Использование awk

awk '{a[$1]=a[$1]==""?$2:a[$1] OFS $2}
END{for (i in a) print i"="a[i]}' FS=\| OFS=, file  

type1=valueA,valueC
type2=valueB,valueD
type3=valueE
0 голосов
/ 29 ноября 2010

Oneliner:

for a in `awk "-F|" '{print $1;}' test | sort -u` ; do echo -n "$a =" ; grep -e "^$a" test | awk "-F|" '{ printf(" %s,", $2);}' ; echo "" ; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...