【问题标题】:awk to count and print header row of fileawk 计算和打印文件的标题行
【发布时间】:2017-09-10 17:16:02
【问题描述】:

我正在使用headawk 的组合来计算tab-delimited file 的标题行中的字段数。下面似乎非常接近,但我也想在换行符上打印 file 中的标题名称。可能有更好的方法,但希望它是一个开始。谢谢你:)。

文件

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


    【解决方案1】:

    试试这个 -

    $ 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
    

    【讨论】:

    • 也许将 FS 设置为 tab 以防某些字段名称中有空格。
    • 非常感谢你们两个:)。
    • @VIPINKUMAR 今天早上你真的需要更多的咖啡!第一个脚本只能在某些 awks 中工作,因为它依赖于在 END 部分填充的每个 POSIX 的 $0 的未定义行为,应该只使用 print NF, "..." 而不是 printf NF " ...\n",不需要在中指定 $0打印,因为这是默认设置。第二个有一些与第一个相同的问题加上你不应该做printf $0,总是printf "%s", $0,因为当你的输入包含 printf 格式字符时,前者会神秘地失败,并且不要硬编码“\n " 使用 ORS 实现可移植性。
    • 你越来越近了,但第一个命令行根本不起作用(它会为输入文件的每一行打印相同的输出,而不是只打印一次,然后打印什么;将在END 是未定义的)所以你应该摆脱它。同样在您的第二个脚本中您的输出文本,因此您应该使用输出 RS(ORS)而不是输入 RS,以及为什么在字符串中硬编码一个空格而不仅仅是 print NF, "..."。一旦你解决了所有这些问题,你的答案当然会和我的一模一样......
    【解决方案2】:
    awk -F'\t' '{print NF, "fields detected in file" ORS $0; exit}' file
    

    【讨论】:

    • 不,不会的。这些字段是制表符分隔的 - 请参阅问题中的示例,其中 OP 明确显示在输入文件上使用 -F'\t' 会输出 6 作为字段数。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多