用于计数和打印文件头行的awk

用于计数和打印文件头行的awk,awk,Awk,我正在使用head和awk的组合来计算以选项卡分隔的文件的头行中的字段数。下面的内容看起来非常接近,但我还想在换行符上打印文件中的标题名。也许有更好的方法,但希望这是一个开始。谢谢:) 文件 Index Chr Start End Ref ALT awk带电流输出 head -n 1 file | awk -F'\t' '{print NF " fields detected in file"}' 6 fields detected in file 所需输出 6 fields det

我正在使用
head
awk
的组合来计算以
选项卡分隔的
文件的头行中的字段数。下面的内容看起来非常接近,但我还想在换行符上打印
文件中的标题名。也许有更好的方法,但希望这是一个开始。谢谢:)

文件

Index   Chr Start   End Ref ALT
awk带电流输出

head -n 1 file | awk -F'\t' '{print NF " fields detected in file"}'
6 fields detected in file
所需输出

6 fields detected in file
Index   Chr Start   End Ref ALT
试试这个-

$ awk ' {print NF " fields detected in file"} END {print}' f
6 fields detected in file
Index   Chr Start   End Ref ALT

$ awk ' {print NF " fields detected in file"RS $0;exit}' f
6 fields detected in file
Index   Chr Start   End Ref ALT
试试这个-

$ awk ' {print NF " fields detected in file"} END {print}' f
6 fields detected in file
Index   Chr Start   End Ref ALT

$ awk ' {print NF " fields detected in file"RS $0;exit}' f
6 fields detected in file
Index   Chr Start   End Ref ALT

如果您的文件不只是头文件,还包含数据

awk -F'\t' '{print NF " fields detected in file"; print; exit}' file

您不需要
标题
语句。但是,您只是在检查标题,更好的QC脚本应该检查所有记录的长度。

如果您的文件不仅包含标题,还包含数据

awk -F'\t' '{print NF " fields detected in file"; print; exit}' file
awk -F'\t' '{print NF, "fields detected in file" ORS $0; exit}' file

您不需要
标题
语句。不过,您只是在检查标题,更好的QC脚本应该检查所有记录长度。

也许可以将FS设置为tab,以防某些字段名中有空格。非常感谢:)@VIPINKUMAR您今天早上真的需要更多咖啡!第一个脚本只在某些AWK中工作,因为它依赖于在末尾部分填充的
$0
POSIX中未定义的行为,应该只使用
print NF“…”
,而不是
printf NF“…\n”
,不需要在打印中指定
$0
,因为这是默认设置。第二个与第一个有一些相同的问题,另外,您永远不应该执行
printf$0
,而应该始终执行
printf“%s”、$0
,因为当您的输入包含printf格式字符时,前者将以加密方式失败,并且不要硬编码“\n”使用ORS实现可移植性。您离第一个命令行越来越近了,但是第一个命令行根本不起作用(它将为输入文件的每一行打印相同的输出,而不是只打印一次,最后打印的内容是未定义的),因此您应该将其删除。另外,在第二个脚本中,您需要输出文本,因此您应该使用输出RS(OR)而不是输入RS,为什么要在字符串中硬编码空格,而不仅仅是
print NF,“…”
。一旦你解决了所有这些问题,你的答案当然会和我的一模一样……也许可以将FS设置为tab,以防一些字段名中有空格。非常感谢你们:)@VIPINKUMAR今天早上你真的需要更多的咖啡!第一个脚本只在某些AWK中工作,因为它依赖于在末尾部分填充的
$0
POSIX中未定义的行为,应该只使用
print NF“…”
,而不是
printf NF“…\n”
,不需要在打印中指定
$0
,因为这是默认设置。第二个与第一个有一些相同的问题,另外,您永远不应该执行
printf$0
,而应该始终执行
printf“%s”、$0
,因为当您的输入包含printf格式字符时,前者将以加密方式失败,并且不要硬编码“\n”使用ORS实现可移植性。您离第一个命令行越来越近了,但是第一个命令行根本不起作用(它将为输入文件的每一行打印相同的输出,而不是只打印一次,最后打印的内容是未定义的),因此您应该将其删除。另外,在第二个脚本中,您需要输出文本,因此您应该使用输出RS(OR)而不是输入RS,为什么要在字符串中硬编码空格,而不仅仅是
print NF,“…”
。一旦你解决了所有这些问题,你的答案当然会和我的一模一样……不,不会的。字段是以制表符分隔的-请参见问题中的示例,其中OP明确显示在输入文件上使用
-F'\t'
会输出6作为字段数。不会。字段是以制表符分隔的-请参见问题中的示例,其中OP明确显示在输入文件上使用
-F'\t'
会输出6作为字段数。
awk -F'\t' '{print NF, "fields detected in file" ORS $0; exit}' file