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

时间:2013-03-10 01:13:32

标签: 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的输出存储在变量而不是临时文件中?

4 个答案:

答案 0 :(得分:1)

#!/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

答案 1 :(得分:1)

不需要使用awk。你可以尝试这样的事情:

#!/bin/bash       # bash 4
declare -A DEPARTMENT
while read -a field
do
  (( DEPARTMENT[${field[3]}]++ ))
done < employees.txt

for dep in "${!DEPARTMENT[@]}"
do
  printf "%s\n" "$dep ${DEPARTMENT[$dep]}"
done

答案 2 :(得分:0)

array=[]

不正确。 Bash数组声明为

declare -A array=()

或者只是

array=()
  

此外 - 是否有一个语法,我可以使用完成关键字后获取的条目   第四栏?我试过了done < awk '{print $4}' employees.txt

您可以尝试进程替换

done < <(awk '{print $4}' employees.txt)

答案 3 :(得分:0)

两个解决方案,bash中的第一个解决方案(与其他给定的解决方案类似,但更简洁 - 无需使用awk来取出第四列,而是使用{{1 }})。

首先,read实施:

bash

#!/usr/bin/bash declare -A dept while read -r _ _ _ d _; do ((dept[$d]++)) done <<-'!' 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 ! for d in "${!dept[@]}"; do printf '%s %d\n' "$d" "${dept[$d]}" done 实施非常相似:

awk