Bash 在一行上打印两个awk匹配项

Bash 在一行上打印两个awk匹配项,bash,shell,awk,Bash,Shell,Awk,我正在尝试为一个赋值创建一个bash脚本,它匹配特定的文本字段,并以特定的格式打印它们。我试图获取课程号、标题和学时数(从十进制转换为整数),并将其输出到名为course\u list的文件中 样本输入: CSC 1010 - COMPUTERS & APPLICATIONS Computers and Applications. Prerequisite: high school Algebra II. History of computers, hardware components

我正在尝试为一个赋值创建一个bash脚本,它匹配特定的文本字段,并以特定的格式打印它们。我试图获取课程号、标题和学时数(从十进制转换为整数),并将其输出到名为
course\u list
的文件中

样本输入:

CSC 1010 - COMPUTERS & APPLICATIONS
Computers and Applications. Prerequisite: high school Algebra II. History of computers, hardware components, operating systems, application software, data communication. 
3.000 Credit hours
以下是我所拥有的:

#!/bin/bash
awk '/CSC/ {print $1$2","$4,$5,$6,$7,$8,$9} /[0-9].(000)/ {print substr(","$1,1,2)}' courses.txt | cat >> course_list
以下是我得到的输出:

CSC1010,COMPUTERS & APPLICATIONS   
,3
以下是我想要的输出:

CSC1010,COMPUTERS & APPLICATIONS,3
我想我已经很接近了,但是我无法想出如何在没有使用sed的情况下打印两个单独的匹配项:

sed -n 's/CSC[^-]*-[ ]*\([^\.]*\).*\([0-9][0-9]*\)\.000[ ]*Credit.*/\1,\2/p' input
使用sed:

sed -n 's/CSC[^-]*-[ ]*\([^\.]*\).*\([0-9][0-9]*\)\.000[ ]*Credit.*/\1,\2/p' input
说明:

NF
是存储字段数量的内部变量
$NF
保存最后一个字段的值。由于OP希望捕获位于
NF-2
位置的课程时数,因此我们将其打印出来

说明:


NF
是存储字段数量的内部变量
$NF
保存最后一个字段的值。由于OP希望捕获位于NF-2位置的课程时数,我们打印了它。

@Powdercake,是的,很接近。只需将
{print substr(“,”$1,1,2)}
更改为
{print$1+0}
即可将
$1
强制转换为(默认)数字格式(并省去管道和cat,如提到的@John Zwinck)

@Powdercake,是的,很接近。只需将
{print substr(“,”$1,1,2)}
更改为
{print$1+0}
即可强制将
$1
转换为(默认)数字格式(并省去管道和cat,如@John Zwinck所述)

这个:
| cat>>课程列表
非常有趣:您将输出管道传输到一个程序,该程序会写入它接收到的内容,然后将其重定向到一个文件。只要省略
| cat
部分,它也会做同样的事情!这可能是重复的:
| cat>>课程列表
非常有趣:您将输出传输到一个程序,该程序写入它接收到的内容,然后将其重定向到一个文件。只要省略
| cat
部分,它也会做同样的事情!参数
RS=
的可能重复项被遗漏,没有?学分数到整数的转换也被遗漏了,当课程标题不是3个单词时,它会失败,当文件中超过3行时,它会失败。我假设OPs真实输入中的所有情况都是这样,否则编写脚本就没有意义了。我忽略了参数
RS=
,没有?学分数到整数的转换也被忽略了,当课程标题不是3个单词时,它会失败,当文件中有超过3行时,它会失败。我假设所有这些都是OPs真实输入的情况,否则编写脚本就没有意义了。
$ cat file
CSC 1010 - COMPUTERS & APPLICATIONS
Computers and Applications. Prerequisite: high school Algebra II. History of computers, hardware components, operating systems, application software, data communication.
3.000 Credit hours

$ awk '/CSC/{split($0,a,/ - /); gsub(/ /,"",a[1])} /[0-9].000/{printf "%s,%s,%d\n",a[1],a[2],$1}' file
CSC1010,COMPUTERS & APPLICATIONS,3