使用bash从文件中提取数据

时间:2014-08-09 14:20:47

标签: bash

我有以下文字文件 -

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告诉我一个简单的方法吗?

3 个答案:

答案 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