Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk场分离器特性_Awk - Fatal编程技术网

Awk场分离器特性

Awk场分离器特性,awk,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之间有一个空格,而不是制表符。我仔细检查了这个我相信这是因为FS是在第一个动作中设置的。在调用第一个操作之前,第一行的拆分已经完成,并且它使用默认的FS(空白) 因此,为了使其一致,应该使用-F选项调用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之间有一个空格,而不是制表符。我仔细检查了这个

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


因此,为了使其一致,应该使用
-F
选项调用
awk

如果不在两者之间加空格,awk只会连接字符串

将命令更改为

print $1, " - ", $2
此外,您可能希望为输出设置OFS,正确的方法是:

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

设置FS太晚(第一行被拆分后)

首先,您要更改每行的变量FS;您可能只打算更改一次。另外,如果您确实想更改FS,您可能想在解析任何行之前更改它。POSIX要求对FS的任何更改只影响下一行的解析。(许多实现还不符合该要求,如果当前行还没有被解析,可能会对当前行使用更改后的FS值。)要解决这两个问题,您应该像这样更改FS:

awk 'BEGIN { FS="\t" } {...}' A.txt
print $1, $2
或者这个:

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,您必须打印几个参数,这些参数用逗号分隔,例如:

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

困惑不解的是,我再次查看了示例数据并输出了您当前的结果。也许您的示例数据确实具有以下格式:
BAA1
,也许您确实打算设置FS,以便在$1中获取
BA
,在$2中获取
A1
。如果这是正确的,那么在任何行处理开始之前,请确保在正确的时间设置FS。然后,无论使用什么awk实现,脚本都应该工作。

awk-F“\t”{print$1“-“$2}”A.txt的输出进行比较
-所有三行中的模式都是相同的。因此,您的
FS
仅对A.txt的第一行有影响。