2017-05-24 34 views
0

什麼是從awk輸出中聲明多個變量的更優雅的方式?我有兩個文件是自動生成的。這些文件最多可以有三行。下面是我做了迄今爲止變量聲明的樣本:

$ cat OUTF1.tmp 
     25   16  8.33 VERY GOOD 
     12   17  25 OK 
$ cat OUTF2.tmp 
     30   60  15.38 VERY GOOD 

TMP1="OUTF1.tmp" 
TMP2="OUTF2.tmp" 

MATH_101=$(cat $TMP1 | awk 'NR==1{print $1}') 
ENGLISH_101=$(cat $TMP1 | awk 'NR==1{print $2}') 
SCIENCE_101=$(cat $TMP1 | awk 'NR==1{print $3}') 
GRADE_101=$(cat $TMP1 | awk 'NR==1{print $4}') 

MATH_102=$(cat $TMP1 | awk 'NR==2{print $1}') 
ENGLISH_102=$(cat $TMP1 | awk 'NR==2{print $2}') 
SCIENCE102=$(cat $TMP1 | awk 'NR==2{printf $3}') 
GRADE102=$(cat $TMP1 | awk 'NR==2{print $4}') 

MATH_201=$(cat $TMP2 | awk 'NR==1{print $1}') 
ENGLISH_201=$(cat $TMP2 | awk 'NR==1{print $2}') 
SCIENCE_201=$(cat $TMP2 | awk 'NR==1{printf $3}') 
GRADE_201=$(cat $TMP2 | awk 'NR==1{print $4}') 

等等...

變量內容應該再是:

  • MATH_101 = 25
  • MATH_102 = 12
  • ENGLISH_101 = 16
  • ENGLISH_102 = 17

是否有更好的方法比硬編碼這些變量?

+0

世界你爲什麼要使用這個'awk'呢? –

+0

順便說一句,所有大寫變量實際上是不好的形式。見http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html - 全部大寫名稱用於與意義的操作系統或shell變量;應用程序定義的變量應該是小寫的,這保證了它們不會發生衝突。 –

+0

另外,文件似乎有4行 –

回答

1

這將是字面上一樣容易從你的輸入文件直讀給你的shell腳本的正確方法是從輸入 - > awk->殼......看了那麼明智的答案是做前者。


首先,要簡單而直接的方法:

{ 
    read MATH_101 ENGLISH_101 SCIENCE_101 GRADE_101 
    read MATH_102 ENGLISH_102 SCIENCE_102 GRADE_102 
    read MATH_201 ENGLISH_201 SCIENCE_201 GRADE_201 
} <infile 

變得有點票友:

for level in 101 102 201; do 
    read {MATH,ENGLISH,SCIENCE,GRADE}_"$level" 
done <infile 

既然你有兩個單獨的輸入文件,如果你想將它們串聯合併爲一個流,請考慮用< <(cat file1 file2)替換<infile

+0

可能需要'<<(cat OUTF {1,2} .tmp)'讀取這兩個文件。 – 123

+0

好點;最後作爲註釋編輯。 –

+0

它的工作!謝謝!我仍然好奇GRADE_101如何得到「非常好」而不是「非常」? – Afungus