linux - 如何计算平面文件的单个列中每个术语的出现次数?

标签 linux bash awk

我有以下平面文件 employees.txt

100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Sanjay  Sysadmin   Technology  $7,000
400  Nisha   Manager    Marketing   $9,500
500  Randy   DBA        Technology  $6,000

我想统计每个部门的人数。我知道有更短的方法可以使用 awk '{print $4}' employees.txt | sort | uniq -c 之类的命令来执行此操作但我想学习 while 循环的机制,逐行读取输入

#!/bin/bash
awk '{print $4}' employees.txt > temp_file

array=[]
while read line
do
        if [[ $array[$line] ]]
        then
                $array[$line]=$(($array[$line]+1))
        else
                $array[$line]=0
        fi
done < temp_file

当我运行此脚本时,出现错误 ./process.sh: line 9: [][Sales]+1: syntax error: operand expected (error token is "[][Sales]+1")

此外 - 在 done 之后是否有我可以使用的语法?关键字来获取第四列中的条目?我试过 done < awk '{print $4}' employees.txt但这是不正确的。

此外 - 有没有办法存储 awk '{print $4}' employees.txt > temp_file 的输出?在变量而不是临时文件中?

最佳答案

#!/bin/bash

awk '{print $4}' employees.txt > temp_file
declare -A array
while read line
do
        if [[ ${array["$line"]} ]]; then
          array["$line"]=$(( ${array["$line"]} + 1 ))
        else
          array["$line"]=1
        fi
done < temp_file

for k in "${!array[@]}"; do
  echo "$k ${array[$k]}"
done

关于linux - 如何计算平面文件的单个列中每个术语的出现次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15317813/

相关文章:

bash - 如何在 Bash 中解除绑定(bind)并重新映射 C-w?

linux - 将文本提取到新文件中

linux - 列出 grep 找不到的字符串

bash - 尝试从 UNIX 文件中删除不可打印的字符(垃圾值)

c - 无法使用命令提示符执行 SSH\

linux - bash 脚本 while 循环读取来自用户的输入

perl - 需要将 file2 中与 file1 第一列匹配的字符串替换为 file1 第二列

linux - 在分隔符处拆分文件

linux - 这可以打印在同一行吗?

linux - 预期:从输出和日志文件中删除颜色代码