用于计数和打印文件头行的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