我有一个txt文件
Peugeot:406:1999:Silver:1
Ford:Fiesta:1995:Red:2
Peugeot:206:2000:Black:1
Ford:Fiesta:1995:Red:2我正在寻找一个命令,计数红色福特嘉年华车的数量。每一行的最后一个数字是那辆车的数量。我正在寻找的命令不能使用grep的-c选项。
所以这个命令应该只输出数字4。
任何帮助都是欢迎的,谢谢。
发布于 2014-08-06 19:32:27
简单一点awk就可以做到这一点:
awk -F: '$1=="Ford" && $4=="Red" { c+=$5 } END { print c }' file输出:
4解释:
-F:开关意味着输入字段分隔符是冒号,因此汽车制造商是$1 (第一个字段),模型是$2等等。
如果第一个字段是"Ford“,第四个字段是”红色“,那么将第5个(最后)字段的值添加到变量c中。处理完整个文件后,打印出c的值。
对于本机bash解决方案:
c=0
while IFS=":" read -ra col; do
[[ ${col[0]} == Ford ]] && [[ ${col[3]} == Red ]] && (( c += col[4] ))
done < file && echo $c有效地应用与上面的awk逻辑相同的逻辑,而不需要任何附加的依赖项。
发布于 2014-08-06 19:55:17
方法:
1.)使用一些脚本语言进行计数,如awk或perl等。Awk解决方案已经发布,这里有一个perl解决方案。
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这两个例子都打印
42.)第二种方法是基于shell流水线的。
例如,一些例子:
grep 'Ford:.*:Red:' carfile | cut -d: -f5 | paste -sd+ | bcgrep筛选出正确的行cut获得最后一列paste创建了一条类似于2+2的行,可以通过bc另一个例子是:
sed -n 's/\(Ford:.*:Red\):\(.*\)/\2/p' carfile | paste -sd+ | bcsed滤波与提取另一个例子--不同的计数方式
(echo 0 ; sed -n 's/\(Ford:.*:Red\):\(.*\)/\2+/p' carfile ;echo p )| dcdc的RPN计算器计数,例如,它的工作方式类似于0 2 + --首先是值,最后是操作。0中。2+ 2+这样的数字流。p打印堆栈。还有许多其他的可能性-如何计算一串数字。
例如用bash计数
while read -r num
do
sum=$(( $sum + $num ))
done < <(sed -n 's/\(Ford:.*:Red\):\(.*\)/\2/p' carfile)纯粹的巴什:
while IFS=: read -r maker model year color count
do
if [[ "$maker" == "Ford" && "$color" == "Red" ]]
then
(( sum += $count ))
fi
done < carfile
echo $sumhttps://stackoverflow.com/questions/25168515
复制相似问题