2016-10-21 13 views
-3

こんにちは私はシェルのコマンドラインを使用していて、ファイルから最初の2つのカラムと等級カラムを抽出しようとしています。正規表現を使用してデータを抽出する

私はまた、(0)取得学生証と私は必要としない、私の出力に他のいくつかの添字ています。このコードでは

cat data.txt | cut -d ' ' -f 1,2 

を使用しています。どのように私はこれらのコラムから3〜4文字の単語を得ることができますか?

          ATT ERN CrGPA Qpts 
              --- --- ----- ---- 
    *  Student Id - 
       (0) 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.. 

注CSCコラム1に3文字

+1

入力ファイルはどのように見えますか? –

+0

@mariaこの情報は、コメントではなく質問になるはずです。ただ質問を編集するだけです。 –

+0

okそれについて申し訳ありません – maria

答えて

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個のフィールドをawkで区切って出力します既定の出力セパレータ(OFS)、これはスペースです。

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 
+0

このコードは問題を解決するのに役立つかもしれませんが、質問に答える_why_および/または_how_を説明しません。この追加の文脈を提供することは、長期的な教育的価値を大幅に改善するだろう。どのような制限や仮定が適用されるかなど、あなたの答えを解説してください。 –

+0

また、5番目の列からWとFを否定する方法も教えてください – maria

+0

WFでないABCDを表示したいだけです – maria

関連する問題