我应该使用sed、awk、perl来更改跨多行的文本并只选择所需的信息吗?

我应该使用sed、awk、perl来更改跨多行的文本并只选择所需的信息吗?,perl,sed,awk,Perl,Sed,Awk,我正在为一个班级做一个项目,在这个项目中,我们获取了一个文件,里面有很多描述班级的行,比如下面的一个 CSC 1010-计算机与应用程序 计算机和应用程序。先修课程:高中代数2。计算机历史,>硬件组件、操作系统、应用软件、数据通信。 3000学时 把它变成 CSC1010,计算机与应用,3 我用过: sed -n 's/^CSC /CSC/p' courses.txt > practice.txt 哪些产出: CSC1010-计算机与应用程序 CSC1310-介绍组件编程非主要 CSC2

我正在为一个班级做一个项目,在这个项目中,我们获取了一个文件,里面有很多描述班级的行,比如下面的一个

CSC 1010-计算机与应用程序
计算机和应用程序。先修课程:高中代数2。计算机历史,>硬件组件、操作系统、应用软件、数据通信。
3000学时

把它变成

CSC1010,计算机与应用,3

我用过:

sed -n 's/^CSC /CSC/p' courses.txt > practice.txt
哪些产出:

CSC1010-计算机与应用程序
CSC1310-介绍组件编程非主要
CSC2010-计算机科学简介
CSC2310-计算机编程原理
CSC2320-网站开发基金
CSC2510-COMP SCI的理论基础
CSC3010-计算历史
CSC3210-计算机组织与编程
CSC3320-系统级编程
CSC33—C++程序设计 CSC3410-数据结构-CTW
CSC4110-嵌入式系统
CSC4120-机器人技术简介

我还使用了:

sed '/\.000 Course hours//p' courses.txt > courses10.txt
哪些产出:

三, 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 4. 4. 4. 4. 4. 4. 四,


我的问题是尝试选择sed、awk还是perl更好。到目前为止,我已经使用sed消除了课程名称或学分数以外的行。正如你在上面看到的。我希望使用正则表达式对文件进行排序,得到以“CSC”开头或包含“.000学时”的每一行。我想,在得到输出后,我可以在sed中使用一个命令,从以CSC开头的行的末尾删除新行,并用逗号替换它。之后,我将用逗号替换反斜杠。然而,要做到这一点,我想我需要使用一个扩展表达式,这样sed可能就不存在了。我考虑使用的正则表达式是
(^CSC[0-9]\.000)
。那么,我应该用sed、awk还是perl来做这件事呢。如果你能提供你的理由,说明为什么使用你建议的方法会更有效

我会选择
awk
,因为您需要匹配和重新格式化行,
awk
非常适合:

/CSC/ {                 # Lines that match CSC
    split($0,a,"- ")    # Split the line around the hyphen and following space
    gsub(/ /,"",a[1])   # Remove the spaces from the first part of the split
    printf a[1]","a[2]  # Print the line in required format
}
/Credit hours/ {        # Lines that match Credit hours
    printf ",%i\n",$1   # Print the integer value of credit hours  
}
演示:

我更喜欢
awk
而不是
Perl
,这对这一点没有好处(或缺点)。使用
sed
将是一种regexp攻击,因此我不会使用
sed
解决方案

在Perl中:

while (<>) {
  chomp;
  print if s/^CSC\s+/CSC/ and s/\s+-\s+/,/;
  printf ",%.0f\n", $1 if /^([\d.]+)\s+Credit hours/;
}
while(){
咀嚼;
如果s/^CSC\s+/CSC/和s/\s+-\s+/,则打印;
printf“,%.0f\n”,$1如果/^([\d.]+)\s+学时/;
}

欢迎来到堆栈溢出。请通过发布一些您应用于问题的代码、所有相关错误消息,以及您测试的任何示例来改进您的问题。另外,请包含一个正确格式的预期输出示例,以便大家了解您试图实现的结果。我将再次尝试添加我使用的代码。正如我之前所说的,当我试图提交问题时,它不断地给我错误。你用哪一个来做这件事?随便你喜欢。都试试,然后你告诉我们。任何方法都可以,大多数人都会根据自己最熟悉的东西来选择。@sudo\u O:谢谢。固定的。
while (<>) {
  chomp;
  print if s/^CSC\s+/CSC/ and s/\s+-\s+/,/;
  printf ",%.0f\n", $1 if /^([\d.]+)\s+Credit hours/;
}