我有以下平面文件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
的输出存储在变量而不是临时文件中?
答案 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