-4

以下のようなクラスを説明する行でいっぱいのファイルを取得するクラスのプロジェクトに取り組んでいます

CSC 1010 - コンピュータとアプリケーション
コンピュータとアプリケーション。前提条件: 高校の代数 II。コンピュータの歴史、ハードウェア コンポーネント、オペレーティング システム、アプリケーション ソフトウェア、データ通信。
3.000 クレジット時間

そしてそれを

CSC1010、コンピューターとアプリケーション、3

私が使用した:

sed -n 's/^CSC /CSC/p' courses.txt > practice.txt

出力:

CSC1010 - コンピュータとアプリケーション
CSC1310 - イントロ COMP プログラミング 非専攻 CSC2010
- イントロ コンピュータ サイエンス
CSC2310 - コンピューター プログラミングの プリン CSC2320
- ウェブサイト開発
基金- システムレベルのプログラミング CSC3330 - 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 Course Hours」を含む各行を取得したいと考えていました。その出力を取得した後、sed でコマンドを使用して、CSC で始まる行の末尾から新しい行を削除し、それをコンマに置き換えることができると考えました。その後、バックスラッシュをコンマに置き換えます。ただし、それを行うには、拡張式を使用する必要があると思うので、sed はおそらくアウトになるでしょう。使用を検討していた正規表現は(^CSC |[0-9]\.000). では、これを sed、awk、または perl で行うべきでしょうか。あなたが提案する方法を使用する方が効率的である理由について、理由を含めていただければ幸いです。

4

2 に答える 2

2

パールでは:

while (<>) {
  chomp;
  print if s/^CSC\s+/CSC/ and s/\s+-\s+/,/;
  printf ",%.0f\n", $1 if /^([\d.]+)\s+Credit hours/;
}
于 2013-03-03T18:52:31.773 に答える
1

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 '/CSC/{split($0,a,"- ");gsub(/ /,"",a[1]);printf a[1]","a[2]}/Credit hours/{printf ",%i\n",$1}' file
CSC1010,COMPUTERS & APPLICATIONS,3

awk私はPerl、これには利点(または欠点)がないことを好みます。使用sedすると正規表現のハックになるため、sed解決策には近づきません。

于 2013-03-03T18:20:13.770 に答える