从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}' )
依旧......
变量内容应为:
有没有比硬编码这些变量更好的方法?
答案 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)
。