考虑这些情况:
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 由于被赋值给值而被重建时)打印记录之前的字段)。
这是隐式使用 OFS 的唯一两次 - 打印逗号分隔的值列表时和重建记录时。
当您打印记录时(例如通过print
or print $0
) 如上面的“a”和“c”或打印任何其他字符串您没有使用 OFS。 OFS 可能之前已用于重建记录,如上面的“e”所示,但是打印任何不是逗号分隔列表的内容的行为并不是使用 OFS,它只是打印任何旧字符串,在本例中恰好是 $0。
Note:
- 显式更改字段会使用字段之间的 OFS 从现有字段重建 $0,它不会再次将 $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
如果没有,请随时提问。