我正在尝试使用数据文件的先前版本中的行数来规范化数据文件。阅读完这些 问题后,我认为这可行:
awk -v num=$(wc -l my_first_file.bed) '{print $1, $2, $3, $4/num}' my_other_file.bed
但它会引发这个错误:
awk: cmd. line:1: my_first_file.bed
awk: cmd. line:1: ^ syntax error
使用反斜杠保护.
不会改变任何内容,使用反引号代替 也不会改变任何内容$()
。
我如何将 的输出用作wc -l
变量awk
?这一切都将在 snakemake 管道内发生,因此在灵活性方面我受到一定限制。
内容my_other_file.bed
:
chrUn_KI270548v1 0 50 0.00000
chrUn_KI270548v1 50 192 1.00000
chrUn_KI270548v1 192 497 0.00000
chrUn_KI270548v1 497 639 1.00000
chrUn_KI270548v1 639 723 0.00000
chrUn_KI270548v1 723 860 1.00000
chrUn_KI270548v1 860 865 2.00000
chrUn_KI270548v1 865 879 1.00000
chrUn_KI270548v1 879 991 2.00000
chrUn_KI270548v1 991 1002 3.00000
chrUn_KI270548v1 1002 1021 2.00000
chrUn_KI270548v1 1021 1093 1.00000
chrUn_KI270548v1 1093 1133 2.00000
chrUn_KI270548v1 1133 1222 1.00000
chrUn_KI270548v1 1222 1235 2.00000
chrUn_KI270548v1 1235 1364 1.00000
chrUn_KI270590v1 0 16 4.00000
chrUn_KI270590v1 16 46 5.00000
chrUn_KI270590v1 46 48 6.00000
chrUn_KI270590v1 48 95 7.00000
chrUn_KI270590v1 95 117 8.00000
chrUn_KI270590v1 117 130 9.00000
chrUn_KI270590v1 130 136 8.00000
chrUn_KI270590v1 136 138 7.00000
chrUn_KI270590v1 138 139 6.00000
wc -l filename
将输出包含两列的行;行数和文件名:awk
当您尝试使用此字符串进行除法时,您的代码会变得混乱。如果将文件内容重定向
wc -l
到,则该wc
实用程序将无法输出文件的名称,而只会输出文件中的换行符数:因此,将您的代码更改为:
或者,让我们
awk
来计算一下:或者,
这里,我们提供了
awk
两个文件供使用,但在读取第一个文件时,我们所做的只是增加变量lines
。当开始读取第二个文件时,条件FNR == NR
不再为真(从当前文件读取的记录数不再与整体读取的记录数相同),我们开始执行第二个块。这假设第一个文件永远不会是空的。
如果您希望输出以制表符分隔,那么请不要忘记
OFS="\t"
设置awk
。尝试运行
wc -l my_first_file.bed
:因此,你的命令将被 shell 扩展为
这使得
my_first_file.bed
你的 Awk 命令当然不是有效的 Awk 语法。解决此问题的一种方法是将
wc -l my_first_file.bed
命令更改为仅输出第一列。例如,如下所示:这使用空格作为 cut 输出的分隔符,以便将行数传递给变量。
awk
您可以通过传递两个文件作为操作数来完成此操作:这将执行以下操作:
NR
全局行计数器表示,等于FNR
每个文件的行计数器),我们只需增加行数,但之后跳过执行到下一行。lines
,该值不再增加,因为NR
现在大于FNR
my_first_file.bed
请注意,如果为空,则此操作将不起作用。