Три вещи, которые следует помнить при доступе к элементу в индексном массиве:
arr=(one two three)
element_0="${arr[0]}"
arr=(it is cool to write readable code)
for ((i=0; i < ${#arr[@]}; i++)); do
current_element=${arr[i]} # note, no '$' necessary before i
done
arr=(100 150 350)
((sum_of_first_two = arr[0] + arr[1])) # no need for '{ }'
Следующее будет работать до тех пор, пока в строках «Заголовок» не будет запятой:
awk -F'\t' 'FNR==NR{if ($4=="EC") ec[$2]=$7; else if ($4=="CH") ch[$2]=$7; next}
NR>FNR&&NF>1 {if (!f) f=1; else {$10=ec[$4]; $11=ch[$4];}}1' B.txt FS=',' OFS=',' A.txt
Сначала выполняется синтаксический анализ B.txt
и создание карты «EC -— -Well» -и карты «CH -— -Well» -, которая затем используется. при разборе A.txt
. Мы устанавливаем разделители полей на ,
для A.txt
и гарантируем, что мы обрабатываем только строки с более чем одним полем (, то есть по крайней мере с одним ,
), но не с первым, которое содержит заголовки столбцов.
Обновление
Поскольку в комментарии вы указываете, что иногда B.txt
может содержать пустые поля, где вы хотите убедиться, что они заменены на NaN
, нам нужна дополнительная проверка:
awk -F'\t' 'FNR==NR{if ($4=="EC") ec[$2]=$7; else if ($4=="CH") ch[$2]=$7; next}
NR>FNR&&NF>1 {if (!f) f=1; else {$10=ec[$4]?ec[$4]:"NaN"; $11=ch[$4]?ch[$4]:"NaN";}}1' B.txt FS=',' OFS=',' A.txt
Это очень "гольф", но в основном
$10=ec[$4] ? ec[$4] : "NaN"
означает
if (ec[$4]) $10=ec[$4]; else $10="NaN"