Рассмотрим следующие случаи:
a) $ echo '1 2 3' | awk '{print}'
1 2 3
b) $ echo '1 2 3' | awk '{print $1, $2, $3}'
1 2 3
c) $ echo '1 2 3' | awk -v OFS=',' '{print}'
1 2 3
d) $ echo '1 2 3' | awk -v OFS=',' '{print $1, $2, $3}'
1,2,3
e) $ echo '1 2 3' | awk -v OFS=',' '{$1=$1; print}'
1,2,3
Выше показано, как OFS используется в «b» и «d» (когда отдельные поля печатаются в списке через запятую) и в «e» (когда запись $ 0 восстанавливается в результате присвоения значения полю перед печатью записи).
Это только 2 раза, когда OFS используется неявно - при печати списка через запятуюзначений и при восстановлении записи.
Когда вы печатаете запись (например, print
или print $0
) как в «a» и «c» выше или печатаете любую другую строку , выне использует OFS .OFS, возможно, использовался ранее для восстановления записи, как указано выше в «e», но для печати всего, что не является разделенным запятыми списком, не используется OFS, он просто печатает любую старую строку, которая в данном случае просто стоит $ 0.
Примечание:
- Явное изменение поля восстанавливает $ 0 из существующих полей, используя OFS между полями, оно не делит $ 0 на поля снова, поэтому FS не используется в этом процессе.Таким образом, $ 1 = $ 1 или sub (/ 1 /, 2, $ 1) использует OFS, но не FS.
- Явное изменение $ 0 (т.е. неявно как результат 1 выше) делит $ 0 на поля с использованием FS в качестве разделителя, он никак не использует OFS.Таким образом, $ 0 = $ 0 или sub (/ 1 /, 2) использует FS, но не OFS.
Понимание того, как FS и OFS работают вместе и как они влияют на назначения полей и $ 0, очень важно.Если вы можете объяснить это поведение, тогда у вас это есть:
f) $ echo 'a b' | awk -v OFS=',' '{print NF, $0, $1, $2}'
2,a b,a,b
g) $ echo 'a b' | awk -v OFS=',' '{$1=$1; print NF, $0, $1, $2}'
2,a,b,a,b
h) $ echo 'a b' | awk -v OFS=',' '{$1=$1; $0=$0; print NF, $0, $1, $2}'
1,a,b,a,b,
i) $ echo 'a b' | awk -v OFS=',' '{$1=$1; $0=$0; FS=OFS; print NF, $0, $1, $2}'
1,a,b,a,b,
j) $ echo 'a b' | awk -v OFS=',' '{$1=$1; $0=$0; FS=OFS; $1=$1; print NF, $0, $1, $2}'
1,a,b,a,b,
k) $ echo 'a b' | awk -v OFS=',' '{$1=$1; $0=$0; FS=OFS; $1=$1; $0=$0; print NF, $0, $1, $2}'
2,a,b,a,b
Если нет, то не стесняйтесь задавать вопросы.