使用一列中的特定符号计算行数(来自grep的结果)?

时间:2015-10-22 02:10:17

标签: bash shell grep

说我有一个文件,file.txt:

F1 ID1 *
F1 ID2 *
F1 ID1 -
F1 ID3 *
F2 ID2 *
F1 ID3 *
F2 ID1 *
F1 ID1 -
F2 ID1 -
F2 ID3 *

目标是将文件限制为仅包含第一列中F1的行,并查找带有' - '的行数。在第三列中......除以第一列中F1的总行数。

F1 ID1 *
F1 ID2 *
F1 ID1 -
F1 ID3 *
F1 ID3 *
F1 ID1 -

在这种情况下,2/6 = 0.333

到目前为止我做了什么:

我开始寻找第一列为F1的所有行并将其存储在变量

result=$(grep F1 file.txt)

但它并没有做我想做的事。为什么只有grep的最后一行存储在$ result中?

echo $result
F1 ID1 -

3 个答案:

答案 0 :(得分:4)

您可以这样做:

$ grep ^F1 test.txt | awk '{sum += 1; if($3=="-") dash += 1} END {print dash/sum}'
0.333333

说明:

  • ^F1表示给我以F1
  • 开头的行
  • 的输出发送到awk
  • 对于awk获取的每一行,它会递增sum;如果第3列是dash
  • ,则增加-
  • 阅读完所有行(END)后,打印数学结果

答案 1 :(得分:3)

你可以这样做:

$ echo "scale=3; $(grep -c '^F1 [^ ]\+ -$' file.txt) / $(grep -c '^F1 ' file.txt)" | bc -l
.333

答案 2 :(得分:2)

cat test.txt | awk '/^F1/{a++;if($3=="-")b++};END{print b/a}' # 0.33333
grep ^F1 test.txt | awk '$3=="-"{d+=1};END{print d/NR}' # 0.33333