Как разобрать и вставить в ту же строку в awk

Три вещи, которые следует помнить при доступе к элементу в индексном массиве:

1. Нормальное выражение -жестко заданный индекс

arr=(one two three)
element_0="${arr[0]}"

2. Индекс нормального выражения -хранится в переменной

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

3. Арифметическое выражение с элементами массива

arr=(100 150 350)
((sum_of_first_two = arr[0] + arr[1])) # no need for '{ }'
0
06.10.2020, 10:34
1 ответ

Следующее будет работать до тех пор, пока в строках «Заголовок» не будет запятой:

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"
1
18.03.2021, 22:59

Теги

Похожие вопросы