awk字段分隔符行为

时间:2011-02-10 15:48:37

标签: awk

为什么这个awk脚本:

awk '{FS = "\t" ; print $1 " - " $2}' A.txt

使用此输入文件A.txt

B A A1
C B A2
D A A3

输出这些结果

B - A
C B - A2
D A - A3

请注意,在第一个B和A之间有一个空格而不是制表符。我仔细检查了这个

4 个答案:

答案 0 :(得分:7)

我相信这是因为FS正在设置第一个动作。在调用第一个操作之前,第一行的拆分已经完成,它使用默认的FS(空白)。

为了使其保持一致,您应该使用awk选项调用-F

答案 1 :(得分:7)

正确的方法是:

BEGIN {FS = "\t"}
{ print $1 " - " $2}  

您设置的FS太晚了(在拆分第一行之后)

答案 2 :(得分:2)

首先,你要改变每行的变量FS;你可能只打算改一次。此外,如果您确实想要更改FS,则可能需要在解析任何行之前更改它。 POSIX要求对FS的任何更改仅影响 next 行的解析。 (许多实现尚未符合该要求,并且如果当前行尚未被解析,则可能使用FS的更改值作为当前行。)要解决这两个问题,您应该更改FS,如下所示:

awk 'BEGIN { FS="\t" } {...}' A.txt

或者这个:

awk -v 'FS=\t' '{...}' A.txt

(还有一个使用-F '\t'而不是-v 'FS=\t'的表单,但是awk的某些实现不会尊重前一个构造中的C-escape \t。)

但请注意,FS管理输入数据的解析,而OFS控制输出数据的解析。从您的问题中不清楚您想要做什么。首先,您的输入数据看起来不像它中有任何标签,因此您可能希望将FS保留为其默认值“”。

如果要更改输出格式,可以使用我们刚才为FS描述的方式将OFS设置为“\ t”。但是,不清楚这是你想要的,因为你没有在你的测试脚本中使用OFS。当你说:

print $1 " - " $2

你打印一个参数,这是$ 1和“ - ”以及$ 2的串联。要使用OFS,你必须打印几个参数,用逗号分隔 - 例如:

print $1, $2

困惑,我再次查看您提供的样本数据并输出。也许您的示例数据确实具有以下格式:B<space>A<tab>A1,也许您打算设置FS以便抓取$ 1中的B<space>A和{{1 2美元。如果这是正确的,那么只需确保在任何行处理开始之前在正确的时间设置FS。无论你使用什么awk实现,你的脚本都应该工作。

答案 3 :(得分:0)

如果你之间没有空格,awk只是连接字符串。

将命令更改为

print $1, " - ", $2

你也可能想要为输出设置OFS