1

ファイルから情報を抽出するには、awk スクリプトを使用する必要があります。11 個のフィールドを持つタイトル行があり、それを という配列に分割しましたtitleList

Student Number:Name:Lab1:Lab2:Lab3:Lab4:Lab5:Lab6:Exam1:Exam2:Final

適切な行を見つけた後、たとえば結果が次の場合、タイトルが続くフィールドを出力する必要があります。

92839342:Robert Bloomingdale:9:26:18:22:9:12:25:39:99

この方法で印刷する必要があります。

Student Number:92839342 Name:Robert Bloomingdale Lab1:9 Lab2:26 Lab3:18
Lab4:22 Lab5:9 Lab6:12 Exam1:25 Exam2:39 Final:99

私はそれを管理するために for ループを使用します:

for (i=0 ;i<=NF ;i++)
{
    printf "%s %s %s %s",titleList[i],":",$i," "
}

2 つの問題がある結果を除いて、すべてが良さそうに見えます。1 つ目は各結果の間に余分なスペースがあり、2 つ目は検索された行の最後のフィールドが欠落していることです。

    Student Number : 92839342  Name : Robert Bloomingdale  Lab1 : 9  Lab2 : 26
    Lab3:18  Lab4 : 22  Lab5 : 9  Lab6 : 12  Exam1 : 25  Exam2 : 39  Final 

私は何をすべきか?\n検索結果の最後に問題はありますか?

4

1 に答える 1

1

printf次のステートメントを修正することで、フィールド間の余分な空白の量を修正できます。

awk -F ":" 'NR == 1 { split($0, array, FS) } NR >= 2 { for (i=1; i<=NF; i++) printf "%s:%s ", array[i], $i; printf "\n" }' file.txt

の内容file.txt:

Student Number:Name:Lab1:Lab2:Lab3:Lab4:Lab5:Lab6:Exam1:Exam2:Final
92839342:Robert Bloomingdale:9:26:18:22:9:12:25:39:99

結果:

Student Number:92839342 Name:Robert Bloomingdale Lab1:9 Lab2:26 Lab3:18 Lab4:22 Lab5:9 Lab6:12 Exam1:25 Exam2:39 Final:99

編集:

また、作業しているファイルにはおそらく Windows の改行文字が含まれているため、最後の値が欠落しています。これを修正するには、コードdos2unix file.txtを実行する前に次を実行しますawk。または、 のレコード セパレーターを設定awkして、改行の末尾を理解することもできます。

awk 'BEGIN { RS="\r\n"; FS=":" } NR == 1 { split($0, array, FS) } NR >= 2 { for (i=1; i<=NF; i++) printf "%s:%s ", array[i], $i; printf "\n" }' file.txt

編集:

上記では GNU awk が必要です。デフォルトで FS で split() が分割されるため、それを引数として使用する必要はありません。反対の条件を指定するのではなく、"next" を使用するのが一般的であり、printf " の代わりに print "" を使用するのが一般的です。 \n" そのため、出力ステートメントで値をハードコーディングするのではなく、ORS 設定を使用します。したがって、上記を次のように調整する必要があります。

gawk 'BEGIN { RS="\r\n"; FS=":" } NR == 1 { split($0, array); next } { for (i=1; i<=NF; i++) printf "%s:%s ", array[i], $i; print "" }' file.txt
于 2012-10-17T03:34:59.410 に答える