Как работает `... | awk '$1=$1' `удалить лишние пробелы?

Я бы сначала перебрал меньший файл:

awk -F, -v OFS=, '
    NR == FNR    { weight[$1] = $2; next }
    $8 in weight { $(NF+1) = weight[$8] }
    1
' file2.txt file1.txt
17
20.02.2020, 12:37
2 ответа

Когда мы присваиваем значение переменной поля, т.е. значение $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

20
28.04.2021, 23:22
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'

ничего не выводит.

12
28.04.2021, 23:22

Теги

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