了解 OFS 在 AWK 中的工作原理

2024-04-21

这是后续我的问题 https://stackoverflow.com/questions/55876705/awk-ofs-is-not-working-with-fs-character-set了解有关 AWK 中 OFS 的更多信息。

我的理解是,一开始设置一次,它将在“打印”中用于分隔字段。但是,正如我最初的问题中所解释的,它没有按预期工作。

我的文件:someone.txt

LN_A,FN_A<[email protected] /cdn-cgi/l/email-protection>;
LN_B,FN_B<[email protected] /cdn-cgi/l/email-protection>;

预期输出:

FN_A,LN_A,aa
FN_B,LN_B,bb 

我已经尝试过以下方法:

awk -F'[,<@]' -v OFS=',' '{print $2 $1 $3}' someone.txt
awk -F'[,<@]' -v OFS=',' 'NF=3 {print $2 $1 $3}' someone.txt
awk -F'[,<@]' -v OFS=',' 'NF=3; {print $2 $1 $3}' someone.txt
awk -F'[,<@]' -v OFS=',' '{$1=$1} {print $2 $1 $3}' someone.txt
awk -F'[,<@]' -v OFS=',' '{$1=$1} {print $0}' someone.txt

最后,我设法通过以下内容获得所需的输出:

awk -F'[,<@]' '{print $2 "," $1 "," $3}' someone.txt

考虑这些情况:

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:

  1. 显式更改字段会使用字段之间的 OFS 从现有字段重建 $0,它不会再次将 $0 重新拆分为字段,因此在此过程中不使用 FS。因此 $1=$1 或 sub(/1/,2,$1) 使用 OFS 而不是 FS。
  2. 显式更改 $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

如果没有,请随时提问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 OFS 在 AWK 中的工作原理 的相关文章

随机推荐