如何从文件中总结和移动在Linux的另一个文件中的具体方式?

Acttualy这是我的任务。我有三四个文件,与学生logging有关。每个文件都有两三个学生logging。就像这样

课程名称:Opreating系统
学分:4
 123456 1 1 0 1 1 0 1 0 0 0 1 5 8 0 12 10 25
 243567 0 1 1 0 1 1 0 1 0 0 0 7 9 12 15 17 15

每个文件都有不同的coursename.I我做了每个coursename和studentid在一个文件中移动,但现在我不知道如何添加所有标记,并移动到另一个文件在同一个地方是id? 你能告诉我怎么做吗?

它看起来像这样:

学生#操作系统JAVA C ++networking编程GPA
 123456 76 63 50 82 67.75
 243567 80  -  34 63 59

我这样做:

#!/bin/sh find ~/2011/Fall/StudentsRecord -name "*.rec" | xargs grep -l 'CREDITS' | xargs cat > rsh1 echo "STUDENT ID" > rsh2 sed -n /COURSE/p rsh1 | sed 's/COURSE NAME: //g' >> rsh2 echo "GPA" >> rsh2 sed -e :a -e '{N; s/\n/ /g; ta}' rsh2 > rshf sed '/COURSE/d;/CREDIT/d' rsh1 | sort -uk 1,1 | cut -d' ' -f1 | paste -d' ' >> rshf 

一些评论和几个指针:

这将有助于为每一行不自明的代码添加“注释”。 即代码像mv f f.bak不需要评论,但我不知道你的许多代码行的意图是什么。

你用'#'字符插入注释,就像

 # concatenate all files that contain the word CREDITS into a file called rsh1 find ~/2011/Fall/StudentsRecord -name "*.rec" | xargs grep -l 'CREDITS' | xargs cat > rsh1 

还要注意,当您的示例文件显示混合大小写时,您始终使用全部大写字母作为搜索目标,即CREDITS。 要么使用正确的情况下为您的搜索目标,即

 `grep -l 'Credits'` 

或者告诉grep到-i(gnore case),即

 `grep -il 'Credits' 

你的线

 sed -n /COURSE/p rsh1 | sed 's/COURSE NAME: //g' >> rsh2 

可以减少到1个电话sed(和你有相同的情况下混淆的事情),尝试

 sed -n '/COURSE/i{;s/COURSE NAME: //gip;}' rsh1 >> rsh2 

这意味着( -n默认不打印每一行),

 `gip` = global substitute, = ignore case in matching print only lines where substituion was made 

所以你正在编辑出字符串COURSE NAME,对于有COURSE的行,只打印这些行(你可能不需要'g'(全局)说明符,因为你只希望每行有一个实例)

你的线

  sed -e :a -e '{N; s/\n/ /g; ta}' rsh2 > rshf 

其实看起来相当不错,非常先进,你试图把每两条线“折”成一条线,对吧?

但,

 sed '/COURSE/d;/CREDIT/d' rsh1 | sort -uk 1,1 | cut -d' ' -f1 | paste -d' ' >> rshf 

我真的很困惑,这是你试图给学生分数? (嵌入排序我猜不是)。 你为什么认为你需要一个排序,

尽管可以在sed中执行算术操作,但是这太疯狂了,所以您可以使用bash变量来计算值,或者使用一个unix工具来处理文本,并对所呈现的数据执行逻辑和数学运算, awk或perl在这里想到

无论如何,总计每个分数的一个解决方案是使用awk

  echo "123456 1 1 0 1 1 0 1 0 0 0 1 5 8 0 12 10 25" |\ awk '{for (i=2;i<=NF;i++) { tot+=$i }; print $1 "\t" tot }' 

会给你一个关于如何进行的线索。

Awk具有预定义的变量,它为每个文件以及它读取的每一行文本填充

 $0 = complete line of text (as defined by the internal variables RS (RecordSeparator) which defaults to '\n' new-line char, the unix end-of-line char $1 = first field in text (as defined by the internal variables FS (FieldSeparator) which defaults to (possibly multiple) space chars OR tab char a line with 2 connected spaces chars and 1 tab char has 3 fields) NF = Number(of)Fields in current line of data (again fields defined by value of FS as described above) (there are many others, besides, $0, $n, $NF, $FS, $RS). 

你可以像例子代码一样使用一个变量,例如$ i(i是一个介于2和NF之间的数字的变量,以编程方式增加$ 1,$ 2,$ 3等数值。场地我(即$ 2,$ 3,$ 4 …)

顺便说一句,你的问题可以很容易地用一个awk脚本解决,但显然,你应该学习cat, cut, grep等,这是一个非常有价值的目标。

我希望这有帮助。