您好我正在使用shell命令行并尝试从文件中提取课程前两列和成绩列。
我正在使用
cat data.txt | cut -d ' ' -f 1,2
通过这段代码我也得到(001234),学生ID和我输出中的其他一些我不需要的下标。我怎么能从这些专栏中得到3-4个字母的单词,因为我认为应该这样做。 继承人输入文件
ATT ERN CrGPA Qpts
--- --- ----- ----
* Student Id -
(001234) UNIV OF SOME COOL PLACE
BIOL 310 GENERAL BIOLOGY BIOS 101 W 3.00 0.00 0.00 0.00 20081
CIBI 300 FUND OF BIOL I BIOS 110 B 3.00 3.00 3.00 9.00 20072
CIBI 300 FUND OF BIOL II BIOS 120 D 3.00 3.00 3.00 3.00 20082
CIBI 300 FUND OF BIOL II BIOS 120 W 3.00 0.00 0.00 0.00 20102
QUIM 300 GEN CHEMISTRY I CHEM 121 F 3.00 0.00 3.00 0.00 20091
QUIM 300 GEN CHEMISTRY I CHEM 121L F 1.00 0.00 1.00 0.00 20091
CSC 303 FUNDMTL STRUCTU CSC100+ F 3.00 0.00 3.00 0.00 20091
结果应该是
BIOL 310 W
CIBI 300 B
CIBI 300 D
CIBI 300 W
So on..
注意第1列中的CSC是3个字母
答案 0 :(得分:0)
您的输入数据看起来像是由固定宽度列组成,这意味着您需要将解决方案建立在列(字符)位置而不是由分离器:
$ tail +5 data.txt | cut -c 12-15,16-20,47-48
BIOL 310 W
CIBI 300 B
CIBI 300 D
CIBI 300 W
QUIM 300 F
QUIM 300 F
CCOM 303 F
tail +5
跳过标题行cut -c 12-15,16-20,47-48
指定要提取的字符串作为列位置范围列表;在第2和第3个输出字段的情况下,这包括字段前面的空格字符。原始答案,在澄清要求之前:
如果你只是想忽略标题行,一个简单的修复就是:
awk 'NF >= 11 { print $1, $2 }' data.txt
看起来所有数据行都有(至少)11个字段,因此NF >= 11
确保只处理数据行,而print $1, $2
只打印前2个以空格分隔的字段,以{分隔{1}}的默认输出分隔符(awk
),这是一个空格。
答案 1 :(得分:0)
awk 'NR>4{print $1,$2"\t",$(NF-5)}' file
BIOL 310 W
CIBI 300 B
CIBI 300 D
CIBI 300 W
QUIM 300 F
QUIM 300 F
CCOM 303 F