2016-03-19 20 views
0

我有一个包含以下内容的示例文件。当使用不同的FS语法时awk中的不同结果

logging.20160309.113.txt.log: 0 Rows successfully loaded. 
logging.20160309.1180.txt.log: 0 Rows successfully loaded. 
logging.20160309.1199.txt.log: 0 Rows successfully loaded. 

我目前熟悉在awk中实现Field Separator语法的两种方法。但是,我目前得到不同的结果。

对于我用

“FS =”语法时,我的FS是多于一个字符的时间最长。

“-f”标志当我的FS只​​是一个字符。

我想了解为什么FS =语法给了我一个意想不到的结果,如下所示。不知何故,第一张唱片被留下。

$ head -3 reload_list | awk -F"\.log\:" '{ print $1 }' 
awk: warning: escape sequence `\.' treated as plain `.' 
awk: warning: escape sequence `\:' treated as plain `:' 
logging.20160309.113.txt 
logging.20160309.1180.txt 
logging.20160309.1199.txt 
$ head -3 reload_list | awk '{ FS="\.log\:" } { print $1 }' 
awk: warning: escape sequence `\.' treated as plain `.' 
awk: warning: escape sequence `\:' treated as plain `:' 
logging.20160309.113.txt.log: 
logging.20160309.1180.txt 
logging.20160309.1199.txt 

回答

1

的原因,就是在你的awk程序设置FS的情况下,它是不是在BEGIN块。因此,在您设置它时,第一条记录已被解析为字段(使用默认分隔符)。

-F

$ awk -F"\\.log:" '{ print $1 }' b.txt 
logging.20160309.113.txt 
logging.20160309.1180.txt 
logging.20160309.1199.txt 

设置FS解析后第一个记录

$ awk '{ FS= "\\.log:"} { print $1 }' b.txt 
logging.20160309.113.txt.log: 
logging.20160309.1180.txt 
logging.20160309.1199.txt 

设置FS分析任何记录之前设置

$ awk 'BEGIN { FS= "\\.log:"} { print $1 }' b.txt 
logging.20160309.113.txt 
logging.20160309.1180.txt 
logging.20160309.1199.txt 

我注意到了awk手册中的相关位。如果你也许已经看到了不同的行为之前或与不同的实现,这可以解释为什么:

根据POSIX标准,awk应该表现得好像 每个记录在时间分成字段它被读取。特别是,在 中,这意味着可以在读取 记录之后,但在引用任何字段之前更改FS的值。田地的价值 (即它们如何分割)应反映FS的旧值 ,而不是新值。

但是,awk的许多实现不这样做。相反, 他们推迟拆分字段,直到实际发生字段引用 ,使用当前的值FS!这种行为可能是 难以诊断。

+0

接受此为提供手动引用的最佳答案。 – Ricsonc

0

-f用于从文件运行脚本。 -FFS工作你得到不同的结果相同

$ awk -F'.log' '{print $1}' logs 
logging.20160309.113.txt 
logging.20160309.1180.txt 
logging.20160309.1199.txt 

$ awk 'BEGIN{FS=".log"} {print $1}' logs 
logging.20160309.113.txt 
logging.20160309.1180.txt 
logging.20160309.1199.txt 
+1

我知道它不会影响输出,但严格来说,我猜这两种情况都应该是'\\。log'。 –

+0

谢谢你。 – Ricsonc