如何将命令的输出除以二并将结果存储到bash变量中?

7

假设我想要执行以下命令:

(cat file | wc -l)/2

如果我想将其存储在一个变量(例如middle)中,该怎么做?这与简单的情况不同。
$middle=$(cat file | wc -l)/2

那我该怎么做呢?
5个回答

15
middle=$((`wc -l < file` / 2))

我们有一个赢家。而且就在我刚刚阅读完 man 手册回来的时候。 (我通常使用纯净的 /bin/sh 编写脚本,所以我总是需要查找 bashisms) - dmckee --- ex-moderator kitten
@blahdiblah:你有没有注意到 OP 使用了 $() 而不是反引号?另外,很好你纠正了无用的 cat,但是你又用了一个无用的重定向。wc 接受文件名作为参数。此外,wc 输出需要剥离文件名才能进行除法运算。 - Dennis Williamson
3
@dennis,这个重定向有一个“目的”。它消除了文件名,只提供行数计数。 - ghostdog74

2
middle=$((`wc -l file | awk '{print $1}'`/2))

说实话,我宁愿不使用 awk,有一种方法可以不用它,我只是在看一本书,上面写着不要使用 sed 或 awk。 - KP65
以上命令可以不用 wc,只需要使用 awk 即可。 - ghostdog74
当你用sed或awk解决一个问题时,现在你有两个问题了。 :) - BZink

2
这取决于Bash能否使用标量语法引用数组的第一个元素,并且默认情况下对空格进行单词拆分。
 middle=($(wc -l file))     # create an array which looks like: middle='([0]="57" [1]="file")'
 middle=$((middle / 2))     # do the math on ${middle[0]}

第二行也可以是:

((middle /= 2))

1
wc -l < file 只获取行数。供参考。 - ghostdog74

0

在赋值变量时,不需要使用$符号

以下是我想出来的:

mid=$(cat file | wc -l)
middle=$((mid/2))
echo $middle

双括号在第二行很重要。我不确定为什么,但我猜它告诉 Bash 它不是一个文件?

0

使用 awk。

middle=$(awk 'END{print NR/2}' file)

你甚至可以只使用Shell编写自己的“wc”程序。

linec(){
  i=0
  while read -r line
  do
    ((i++))
  done < "$1"
  echo $i
}

middle=$(linec "file")
echo "$middle"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接