使用正则表达式,提取数据

时间:2016-10-21 20:37:27

标签: regex perl shell

您好我正在使用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个字母

2 个答案:

答案 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