Bash 数学和文件

Bash 数学和文件

我需要使用 bash 对文件的行和数字进行一些数学运算。就像在 Ruby 或 Python 中一样,您可以轻松地将字符串转换为数字,反之亦然。在 bash 中,所有内容都是无类型的。

我有一个包含这样的数字的文件:1,2,3 我可以迭代它并返回恰好 2。

cat file.txt | sed 's/[^,]//g' | wc -c 

我想将这个结果存储在 $ 变量中,并添加一个固定数字 ((3+1))。例如$total = 2 + 3 + 1 = 6。如何将unix命令的结果存储在变量中以供进一步使用?

number_of_elements = $( sed 's/[^,]//g' elements.txt | wc -c ) 
echo "elements are: $number_of_elements" #2
lines = $(( $number_of_elements + 3 + 1)) & echo "lines are: $lines " #2+3+1
cat file.txt | grep -A $lines "text " > output.txt #open file, grep the "text" and the 6 lines that come after.

似乎存在问题: - 未找到第 1 / 3 行命令 - 作为结果 grep 它不适用于 $lines

答案1

您需要命令替换$()

variable=$(sed 's/[^,]//g' file.txt | wc -c)

现在您可以使用 获取变量引用的值$variable。请注意,在扩展时引用变量几乎总是一个好主意,以避免意外效果(分词和路径名扩展),因此最好使用"$variable".

请注意,我已删除cat file.txtassed采用文件名作为参数。

答案2

编辑二: 你可以不是当你分配一个变量时,Bash 中有空格。这(来自你的帖子):

number_of_elements = $( sed 's/[^,]//g' elements.txt | wc -c )

...不管用。但这会:

number_of_elements=$( sed 's/[^,]//g' elements.txt | wc -c )

删除标志前后的空格=。请阅读@heemayl关于如何使用命令替换的写得很好(并得到好评)的答案!


我想将这个结果存储在 $ 变量中,并添加一个固定数字 ((3+1))。例如$total = 2 + 3 + 1 = 6。如何将unix命令的结果存储在变量中以供进一步使用?

像这样的东西:

myVar=2
total=$(($myVar+2+3+1))
echo $total
8

这里,使用变量$myVar(包含整数2),然后我们添加整数23然后1将其保存在新变量中$total

答案3

number_of_elements = $( sed 's/[^,]//g' elements.txt | wc -c )

将尝试运行该number_of_elements命令,=并将 split+glob 的结果wc作为参数应用于命令的输出。在类似 Bourne 的 shell 中,标量变量赋值时var=value周围没有空格字符=var也必须是文字并且是有效的变量名称)。

另请注意,该sed命令将删除除,、换行符和不构成 中有效字符一部分的字节之外的所有内容elements.txt

如果你只想计算,字符数,你可以这样做:

count=$(tr -cd , < elements.txt | wc -c)

对于,和换行符:

count=$(tr -cd ',\n' < elements.txt | wc -c)

(但请注意,在某些wc实现中,$count可能会有一些前导或尾随空白)。

添加一些数字:

count=$(($(tr -cd , < elements.txt | wc -c) + 1))

的内容$((...))被视为如同内部"...":仍然执行参数扩展、算术扩展和命令替换。要去除上面提到的额外空白,您实际上可以这样做:

count=$(($(... | wc -c)))

代替:

count=$(... | wc -c)

相关内容