Я бы сначала перебрал меньший файл:
awk -F, -v OFS=, '
NR == FNR { weight[$1] = $2; next }
$8 in weight { $(NF+1) = weight[$8] }
1
' file2.txt file1.txt
Когда мы присваиваем значение переменной поля, т.е. значение $1 присваивается полю $1, awk фактически перестраивает его $0, объединяя их с разделителем поля по умолчанию (или пространством OFS ).
мы можем получить тот же случай и в следующих сценариях...
echo -e "foo foo\tbar\t\tbar" | awk '$1=$1'
foo foo bar bar
echo -e "foo foo\tbar\t\tbar" | awk -v OFS=',' '$1=$1'
foo,foo,bar,bar
echo -e "foo foo\tbar\t\tbar" | awk '$3=1'
foo foo 1 bar
Для GNU AWK это поведение задокументировано здесь:
https://www.gnu.org/software/gawk/manual/html_node/Changing-Fields.html
$1 = $1 # force record to be reconstituted
echo "$string" | awk '$1=$1'
заставляет AWK выполнить оценку $1=$1
, которая присваивает поле самому себе и имеет побочный -эффект повторной -оценки $0
; затем AWK рассматривает значение выражения, и, поскольку оно не -нулевое и не -пустое, выполняет действие по умолчанию, то есть печатает $0
.
Дополнительные пробелы удаляются, когда AWK re -оценивает $0
:, он делает это, объединяя все поля, используя OFS
в качестве разделителя, и по умолчанию это один пробел. Когда AWK анализирует запись, $0
содержит всю запись, как и -, а $1
–$NF
содержат поля без разделителей; когда какое-либо поле назначено, $0
восстанавливается из значений поля.
Выводит ли AWK что-либо в этом примере, зависит от ввода:
echo "0 0" | awk '$1=$1'
ничего не выводит.