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

Bash 读取柱状数据——比var1=$(cat | awk)更好的方法;var2=$(cat | awk)等?,bash,shell,unix,awk,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 等等 然后,变量内容应为: 数学101=25 数学

从awk输出声明多个变量的更优雅的方法是什么?我有两个自动生成的文件。这些文件最多可以有三行。以下是我迄今为止所做的变量声明示例:

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


等等

然后,变量内容应为:

  • 数学101=25
  • 数学102=12
  • 英语101=16
  • 英语102=17
  • 等等

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

直接从输入文件读取shell脚本与从输入->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
{
阅读数学、英语、科学、年级
阅读数学、英语、科学、年级
阅读数学、英语、科学、年级

}你到底为什么要用
awk
来做这个呢?顺便说一句,所有caps变量实际上都是糟糕的形式。请参阅--所有caps名称都用于对OS或shell有意义的变量;应用程序定义的变量应为小写,以保证它们不会冲突。此外,该文件似乎有4行作为备用--
cat文件| somecommand
的效率远远低于
somecommand@CharlesDuffy?我不认为STDIN是可以找到的,它成功了!非常感谢。我仍然很好奇,GRADE_101是如何得到“非常好”而不是“非常好”的?@Afungus最后读取的变量捕获了行的其余部分。例如,如果您刚刚阅读了
MATH_101
$MATH_101
将包含整行内容。
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}' )
{
  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