我有以下文字文件 -
1 A 1
3 A 1
4 A 4
5 A 3
6 A 3
7 A 1
9 A 1
1 B 8
2 B 7
3 B 8
4 B 8
5 B 13
6 B 3
7 B 12
8 B 12
8 B 12
8 B 12
9 B 7
第一列代表课程1至9。 第二列代表A和B级。 第三栏代表没有。在各自的课程中获得各自成绩的学生。 现在输出文件应该像 -
1 1 8
2 0 7
3 1 8
4 4 8
5 3 13
6 3 3
7 1 12
8 0 12
9 1 7
第一栏代表课程编号。
第二列代表没有。在该课程中获得A级的学生和第三列的学生代表不。在该课程中获得B的学生
有人可以用bash告诉我一个简单的方法吗?
答案 0 :(得分:2)
for ((I=1;I<=9;I++)); do
while read LINE; do
[[ "$LINE" =~ "$I A" ]] && A="$LINE"
[[ "$LINE" =~ "$I B" ]] && B="$LINE"
done < file.txt
A="${A##* }"
B="${B##* }"
echo $I ${A:-0} ${B:-0}
unset A B
done
输出:
1 1 8
2 0 7
3 1 8
4 4 8
5 3 13
6 3 3
7 1 12
8 0 12
9 1 7
答案 1 :(得分:0)
这个单行程应该让你开始:
join -2 <(grep A data.txt) <(grep B data.txt) | tr -d AB
除了没有人得到A或没有人获得一门B的B的情况外,它的工作原理。
答案 2 :(得分:0)
#!/bin/bash
declare -A data
maxCourseId=0
while read -r course grade students; do
((maxCourseId = course > maxCourseId ? course : maxCourseId))
((data["$course $grade"] += students)) # or just = if you don't want numbers to add up
done < YOURFILE
for ((i = 1; i <= maxCourseId; i++)); do
echo "$i ${data[$i A]:-0} ${data[$i B]:-0}"
done