首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加不带grep -c选项的数字

添加不带grep -c选项的数字
EN

Stack Overflow用户
提问于 2014-08-06 19:23:49
回答 2查看 94关注 0票数 0

我有一个txt文件

代码语言:javascript
复制
Peugeot:406:1999:Silver:1
Ford:Fiesta:1995:Red:2
Peugeot:206:2000:Black:1
Ford:Fiesta:1995:Red:2

我正在寻找一个命令,计数红色福特嘉年华车的数量。每一行的最后一个数字是那辆车的数量。我正在寻找的命令不能使用grep的-c选项。

所以这个命令应该只输出数字4。

任何帮助都是欢迎的,谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-06 19:32:27

简单一点awk就可以做到这一点:

代码语言:javascript
复制
awk -F: '$1=="Ford" && $4=="Red" { c+=$5 } END { print c }' file

输出:

代码语言:javascript
复制
4

解释:

-F:开关意味着输入字段分隔符是冒号,因此汽车制造商是$1 (第一个字段),模型是$2等等。

如果第一个字段是"Ford“,第四个字段是”红色“,那么将第5个(最后)字段的值添加到变量c中。处理完整个文件后,打印出c的值。

对于本机bash解决方案:

代码语言:javascript
复制
c=0
while IFS=":" read -ra col; do 
    [[ ${col[0]} == Ford ]] && [[ ${col[3]} == Red ]] && (( c += col[4] ))
done < file && echo $c

有效地应用与上面的awk逻辑相同的逻辑,而不需要任何附加的依赖项。

票数 1
EN

Stack Overflow用户

发布于 2014-08-06 19:55:17

方法:

1.)使用一些脚本语言进行计数,如awkperl等。Awk解决方案已经发布,这里有一个perl解决方案。

代码语言:javascript
复制
perl -F: -lane '$s+=$F[4] if m/Ford:.*:Red/}{print $s' < carfile
#or
perl -F: -lane '$s+=$F[4] if ($F[0]=~m/Ford/ && $F[3]=~/Red/)}{print $s' < carfile

这两个例子都打印

代码语言:javascript
复制
4

2.)第二种方法是基于shell流水线的。

  • 过滤掉正确的行
  • 用计数提取列
  • 数字之和

例如,一些例子:

代码语言:javascript
复制
grep 'Ford:.*:Red:' carfile | cut -d: -f5 | paste -sd+ | bc
  • grep筛选出正确的行
  • cut获得最后一列
  • paste创建了一条类似于2+2的行,可以通过
  • 计数的bc

另一个例子是:

代码语言:javascript
复制
sed -n 's/\(Ford:.*:Red\):\(.*\)/\2/p' carfile | paste -sd+ | bc
  • sed滤波与提取

另一个例子--不同的计数方式

代码语言:javascript
复制
(echo 0 ; sed -n 's/\(Ford:.*:Red\):\(.*\)/\2+/p' carfile ;echo p )| dc
  • 数字由称为dc的RPN计算器计数,例如,它的工作方式类似于0 2 + --首先是值,最后是操作。
  • 第一个回波放入堆栈0中。
  • sed创建一个像2+ 2+这样的数字流。
  • 最后一个回波p打印堆栈。

还有许多其他的可能性-如何计算一串数字。

例如用bash计数

代码语言:javascript
复制
while read -r num
do
   sum=$(( $sum + $num ))
done < <(sed -n 's/\(Ford:.*:Red\):\(.*\)/\2/p' carfile)

纯粹的巴什:

代码语言:javascript
复制
while IFS=: read -r maker model year color count
do
    if [[ "$maker" == "Ford" && "$color" == "Red" ]]
    then
        (( sum += $count ))
    fi
done < carfile
echo $sum
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25168515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档