如何计算文件中的行数,然后在bash中对该变量使用数学?

时间:2014-08-29 16:09:03

标签: bash math division

我目前正在使用bash脚本将一些其他代码连接在一起,但它是新的并且在最后一天左右一直停留在此。基本上我需要计算文件中的行数,然后将其除以4以获得该文件中的真实对象数(每个对象占用4行)。

为此,我环顾四周,最后得到以下代码:

  a=$(wc -l "${o}"*)

  k=$(wc -l Unmatched_forward.fq)

  x=4

  #declare -i $a

  declare -i $k



  stats1_2=$((a / x))

  stats2_2=$((k / x))

  echo "${stats1_2} reads were joined."

  echo "${stats2_2} reads were not joined."

在此代码中,$ {o}是先前文件的输出,但需要有" .fq"添加到最后,但每当我尝试将其添加到最后它出现下面的错误消息我一直在尝试使用" *"在没有其他类似文件的文件上运行。

" Unmatched_forward.fq"是另一个输出文件,我想计算其中的对象数。

我正在使用declare选项,因为我读了,否则数字将是字符串形式而不是整数,所以数学不能完成。

如果有人可以提供帮助并解释什么是错误的,那就太好了。

错误消息是:

Overlay_code.sh: line 638: declare: `1265272': not a valid identifier
Overlay_code.sh: line 638: declare: `Unmatched_forward.fq': not a valid identifier
Overlay_code.sh: line 643: 1265272 Unmatched_forward.fq: syntax error: invalid arithmetic operator (error token is ".fq")

更令人困惑的是,我突然得到了' 1265272'数字出现并且不知道为什么!

2 个答案:

答案 0 :(得分:1)

你的意思是declare -i k。当您加入$时,您将导致变量名称替换为其值。但是你想说变量k是整数类型的。

答案 1 :(得分:1)

你应该检查你的wc的调用是否真的只返回一个整数,因为我认为它不是。可能会发生以下情况

$>  wc -l Unmatched_forward.fq
128 Unmatched_forward.fq

因此它返回行数文件名。 以下应该有效

k=$(wc -l Unmatched_forward.fq | awk '{print $1}')
x=4
stats1_2=$((k / x))

请注意,bash的(())仅支持整数数学,因此所有结果都将被舍入。如果您需要浮点精度,请查看bc