为什么这个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之间有一个空格而不是制表符。我仔细检查了这个
答案 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