读取柱状数据 - 比var1 = $(cat | awk)更好的方法; var2 = $(cat | awk)等?

时间:2017-05-24 20:53:42

标签: bash shell unix awk

从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

有没有比硬编码这些变量更好的方法?

1 个答案:

答案 0 :(得分:1)

从输入文件到shell脚本直接读取就像从input-> awk-> shell中读取的正确方法一样容易......所以明智的答案就是做前者。

首先,采用简单但直截了当的方法:

{
  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

由于您有两个单独的输入文件,如果您想将它们连接到一个流中,请考虑将<infile替换为< <(cat file1 file2)