通过前3个字符获取文件中的结果计数。

时间:2014-09-02 20:45:14

标签: batch-file

我有一个包含多行代码的文件,其中一些代码包含匹配的客户代码。假设我们有客户ABC,DEF和GHI。每个客户都有几条匹配的行,所以文件就像:

ABC1
ABC2
DEF1
DEF2
DEF3
GHI1
GHI2
GHI3
GHI4

我想要一个批处理脚本,它将运行并返回客户对每个文件的计数。所以上面文件的输出将是

ABC = 2 files
DEF = 3 files
GHI = 4 files

有关于此的任何想法吗?

由于

4 个答案:

答案 0 :(得分:3)

@echo off
setlocal EnableDelayedExpansion

for /F %%a in (file.txt) do (
   set line=%%a
   set /A lines[!line:~0,3!]+=1
)

for /F "tokens=2,3 delims=[]=" %%a in ('set lines[') do echo %%a = %%b files

答案 1 :(得分:0)

使用grep进行Bash可以轻松完成此操作。像这样的东西。

#!/usr/bin/env bash

ABC=$(grep -c "ABC" FILE)
DEF=$(grep -c "DEF" FILE)

echo "ABC = "$ABC" files"

答案 2 :(得分:0)

@echo off
setlocal enableDelayedExpansion
set cust_file=.\cusomers.txt

for /f "useback" %%# in ("%cust_file%") do (
    set "line=%%~#"
    set cust_id=!line:~0,3!
    if not defined cust_c_!cust_id! (
        set /a cust_c_!cust_id!=1
    ) else (
        set /a cust_c_!cust_id!=cust_c_!cust_id!+1
    )
)

rem set cust_c_

for /f "tokens=3,4 delims=_=" %%c in ('set cust_c_') do (
    echo %%c = %%d
)

答案 3 :(得分:0)

我猜你是在Windows上,但万一你也有适当的操作系统; - )

cut -c1-3 YourFile | sort |uniq | while read cust; do n=$(grep -c $cust file);echo $cust:$n; done

那说......提取每行的前3个字符,对它们进行排序并删除重复项(使用uniq)。在循环中一次读取一个客户ID,并要求grep计算文件中每个客户ID的出现次数。

或者,如果您有awk

awk '{id=substr($0,1,3);counts[id]++} END{for(x in counts)print x,counts[x]}' YourFile

这就是说......取每行的前3个字母并保存在变量id中。增加counts[]数组,元素id。在输入文件的末尾,通过counts[]数组,并为每个元素打印其索引以及看到它的次数。