如何在 AWK 中指定*一个*制表符作为字段分隔符?

use*_*766 5 awk tabs field separator

空白字段分隔符(例如使用FS = "\t", in时的制表符)的默认值AWK是一个或多个。因此,如果您想读入制表符分隔的文件,其中某些列(最后一列除外)中包含空值,它将跳过它们。例如:

1 "\t" 2 "\t" "" "\t" 4 "\t" 5
Run Code Online (Sandbox Code Playgroud)

$3即使明显有两个选项卡,也会引用4,而不是 null 。""

我应该怎么做才能将字段分隔符指定为仅一个选项卡,以便引用而不$4引用?45

she*_*ter 5

 echo '1 "\t" 2 "\t" "" "\t" 4 "\t" 5' | awk -F"\t" '{print "$3="$3 , "$4="$4}'
Run Code Online (Sandbox Code Playgroud)

输出

$3=" "" " $4=" 4 " 
Run Code Online (Sandbox Code Playgroud)

所以你可以删除原始字符串中的双引号,并得到

echo '1\t2\t\t4\t5' | awk -F"\t" '{print "$3="$3 , "$4="$4}'
Run Code Online (Sandbox Code Playgroud)

输出2

$3= $4=4
Run Code Online (Sandbox Code Playgroud)

你是对的,默认的 FS 是空格,但需要注意的是,空格和制表符彼此相邻,将有资格作为 1 个 FS 实例。因此,要仅使用“\t”作为 FS,您可以像上面那样作为命令行参数执行操作,或者您可以在 FS 上包含显式重置,通常在块中完成BEGIN,例如

echo '1 "\t" 2 "\t" "" "\t" 4 "\t" 5' | awk 'BEGIN{FS="\t"}{print "$3="$3 , "$4="$4}'
Run Code Online (Sandbox Code Playgroud)

IHTH