gpt4 book ai didi

linux - 如何从文件中求和并以特定方式在 linux 中的另一个文件中移动?

转载 作者:太空狗 更新时间:2023-10-29 11:16:02 27 4
gpt4 key购买 nike

其实这是我的作业。我有三四个文件,按学生记录关联。每个文件都有两三个学生记录。像这样

Course Name:Opreating SystemCredit: 4123456 1 1 0 1 1 0 1 0 0 0 1 5 8 0 12 10 25243567 0 1 1 0 1 1 0 1 0 0 0 7 9 12 15 17 15

Every file have different coursename.I did every coursename and studentid move in one file but now i don't know how to add all marks and move to another file on same place where is id? Can you please tell me how to do it?

It looks like this:

Student# Operating Systems JAVA C++ Web Programming GPA123456       76             63   50       82        67.75243567       80             -    34       63          59

I did like this:

#!/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(忽略大小写),即

`grep -il 'Credits'

你的线路

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

可以减少到对 sed 的 1 次调用(并且您正在发生相同的大小写混淆问题),尝试

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 的任何行编辑字符串 COURSE NAME,并且只打印这些行'(您可能不需要 'g'(全局)说明符,因为您只期望 1 个实例每行)

你的线路

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

实际上看起来很不错,很高级,你想把每 2 行“折叠”成 1 行,对吧?

但是,

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).

您可以通过使用示例代码中的变量以编程方式递增 $1、$2、$3 等值,例如 $i(i 是一个介于 2 和 NF 之间的变量。前导“$”说给我字段 i 的值(即 $2、$3、$4 ...)

顺便说一下,您的问题可以通过一个 awk 脚本轻松解决,但显然,您应该了解 cat、cut、grep 等,这是一个非常值得的目标。

希望对您有所帮助。

关于linux - 如何从文件中求和并以特定方式在 linux 中的另一个文件中移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8160187/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com