了解OFS如何在AWK中工作

了解OFS如何在AWK中工作,awk,Awk,这是对AWK中OFS的进一步了解 我的理解是,在开始时设置一次,它将在打印中用于分隔字段。然而,正如我在最初的问题中所解释的,它并没有像预期的那样起作用 我的文件:someone.txt LN_A,FN_A<aa@xyz.com>; LN_B,FN_B<bb@xyz.com>; 我尝试了以下方法: awk -F'[,<@]' -v OFS=',' '{print $2 $1 $3}' someone.txt awk -F'[,<@]' -v OFS=','

这是对AWK中OFS的进一步了解

我的理解是,在开始时设置一次,它将在打印中用于分隔字段。然而,正如我在最初的问题中所解释的,它并没有像预期的那样起作用

我的文件:someone.txt

LN_A,FN_A<aa@xyz.com>;
LN_B,FN_B<bb@xyz.com>;
我尝试了以下方法:

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
最后,我通过以下方式获得了所需的输出:

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

很简单,您在awk语句的开头设置了OFS=,但您只是简单地打印字段NOTE:不编辑行或不提及字段分隔符,在这种情况下,OFS不会出现在图片中,这就是为什么您的输出没有类似分隔符的内容

awk -F'[,<@]' -v OFS=',' '{print $2,$1,$3}' Input_fie
通过打印整行来理解OFS的示例:让我们通过使用OFS和不使用OFS效果打印整行来更清楚地理解OFS

让我们运行以下代码:

awk -F'[,<@]' -v OFS=',' 'FNR==1{$1=$1} 1'  Input_file

你看到区别了吗?请看第一行的输出和第二行的打印,因为我们只在第一行编辑了第一个字段,所以OFS出现在图片中。

很简单,您已经设置了OFS=,在awk语句的开头,但您只是简单地打印字段注释:不编辑行或不提及字段分隔符使用逗号等,在这种情况下,OFS不会出现在图片中,这就是为什么您的输出没有类似分隔符的内容

awk -F'[,<@]' -v OFS=',' '{print $2,$1,$3}' Input_fie
通过打印整行来理解OFS的示例:让我们通过使用OFS和不使用OFS效果打印整行来更清楚地理解OFS

让我们运行以下代码:

awk -F'[,<@]' -v OFS=',' 'FNR==1{$1=$1} 1'  Input_file
你看到区别了吗?请看第一行的输出和第二行的打印,原因是我们只在第一行编辑了第一个字段,所以OFS进入图片。

考虑以下情况:

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
当单个字段以逗号分隔的列表打印时,在b和d中使用上述OFS;当在打印记录之前将值分配给字段,从而重建记录$0时,在e中使用上述OFS

这是含蓄使用OFS的仅有两次——打印逗号分隔的值列表和重建记录时

当您打印记录时,例如,通过打印或打印上面a和c中的$0,或打印您未使用OFS的任何其他字符串。OFS可能在前面的e中被用于重建记录,但是打印任何不是逗号分隔列表的内容的行为并不是使用OFS,它只是打印任何旧字符串,在本例中正好是$0

注:

显式更改字段会在字段之间使用OFS从现有字段重建$0,不会再次将$0重新拆分为字段,因此在此过程中不会使用FS。所以$1=$1或sub/1/,2,$1使用OFS而不是FS。 显式地将$0更改为使用FS作为分隔符的字段,即不作为resplits$0上的1的结果隐式更改为字段,它不会以任何方式使用OFS。所以$0=$0或sub/1/,2使用FS而不是of。 了解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
如果没有,请随意提问。

考虑以下情况:

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
当单个字段以逗号分隔的列表打印时,在b和d中使用上述OFS;当在打印记录之前将值分配给字段,从而重建记录$0时,在e中使用上述OFS

这是含蓄使用OFS的仅有两次——打印逗号分隔的值列表和重建记录时

当您打印记录时,例如,通过打印或打印上面a和c中的$0,或打印您未使用OFS的任何其他字符串。OFS可能在前面的e中被用于重建记录,但是打印任何不是逗号分隔列表的内容的行为并不是使用OFS,它只是打印任何旧字符串,在本例中正好是$0

注:

显式更改字段会在字段之间使用OFS从现有字段重建$0,不会再次将$0重新拆分为字段,因此在此过程中不会使用FS。所以$1=$1或sub/1/,2,$1使用OFS而不是FS。 显式地将$0更改为使用FS作为分隔符的字段,即不作为resplits$0上的1的结果隐式更改为字段,它不会以任何方式使用OFS。所以$0=$0或sub/1/,2使用FS而不是of。 了解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

如果没有,请随意提问。

因为我刚刚找到了一份未使用的Aho,Kernighan,Weinberger:1988年的AWK编程语言的副本,它将带您进入35-36页的源代码:

字段变量。当前输入行的字段称为$1、$2, 通过$NF$0表示整行。字段共享其他字段的属性 变量-它们可以用于算术或字符串运算,并且可以是 像 签署给

可以将新字符串分配给字段:

    BEGIN                          { FS = OFS = "\t" }
    $4 == "North America"          { $4 = "NA" }
    $4 == "South America"          { $4 = "SA" }
                                   { print }
在此程序中,BEGIN操作设置控制输入的变量FS 字段分隔符和OFS(输出字段分隔符)都被添加到选项卡中。印刷品 第四行中的语句在被修改后打印$0的值 以前的作业。这一点很重要:当$0被赋值或
替换、$1、$2等,NF将重新计算;同样,当$1、$2等中的一个发生变化时,使用OFS将$0重新构造为单独的字段。

因为我刚刚发现了一个未使用的Aho、Kernighan、Weinberger:1988年的AWK编程语言的副本,它将带您进入源页面35-36:

字段变量。当前输入行的字段称为$1、$2, 通过$NF$0表示整行。字段共享其他字段的属性 变量-它们可以用于算术或字符串运算,并且可以是 分配给

可以将新字符串分配给字段:

    BEGIN                          { FS = OFS = "\t" }
    $4 == "North America"          { $4 = "NA" }
    $4 == "South America"          { $4 = "SA" }
                                   { print }
在此程序中,BEGIN操作设置控制输入的变量FS 字段分隔符和OFS(输出字段分隔符)都被添加到选项卡中。印刷品 第四行中的语句在被修改后打印$0的值 以前的作业。这一点很重要:当$0被赋值或
替换、$1、$2等,NF将重新计算;同样,当更改$1、$2等中的一个时,使用OFS将$0重新构造为单独的字段。

谢谢!我也尝试了以下方法。awk-F'[,@acs005,是的,但正如我提到的,直到/除非您编辑新的OFS集合覆盖OFS默认值的行,现在让我在我的答案中添加一个示例。@acs005,我已经添加了一个示例说明,请检查一次,并让我知道您是否有任何疑问?谢谢!我也尝试了以下方法。awk-F'[,@acs005,是的,但正如我提到的,除非您编辑新的OFS集合覆盖OFS的默认值的行,否则我现在就在我的答案中添加一个示例。@acs005,我已经添加了一个示例说明,请检查一次,并让我知道您是否有任何疑问?感谢所有的详细信息,但我需要更多的时间来确保我的答案是正确的没错。一旦我了解了上面提到的所有案例,如果我有任何问题,我会告诉你。不客气,听起来不错。在编码时,我有时还需要仔细考虑几次,所以不要担心,如果不是很明显!我在笔记中记下的两个项目是最重要的,要在你的头脑中固定下来——所有的答案是的,这两点非常清楚,特别是它不会再次将$0重分到字段中。我最初的理解是错误的,认为当使用$1=$1时,它使用OFS来重建$0作为字段之间的字段分隔符,这听起来很明显,但现在不是,因此每个字段都由OFS分隔。理解th在resplit,不再发生是这里的一个关键。感谢所有的细节,但我会花更多的时间来确保我做对了。一旦我了解了上面提到的所有案例,我会让你知道我是否有任何问题。不客气,听起来不错。在编码时,我有时还需要仔细考虑几次,所以不必担心这不是很明显!我放在便笺中的两个项目是最重要的,需要在你的头脑中固定下来——其余的都不在其中。是的,这两点非常清楚,特别是它不会将$0重新分配到字段中。我最初的理解是错误的,认为当你使用$1=$1时,它使用OFS将$0重建为fie字段之间的ld分隔符听起来很明显,但现在不是了,因此每个字段都由OFS分隔。理解重燃不会再次发生是这里的关键。