如何为包括 awk 在内的函数分配输入参数?

如何为包括 awk 在内的函数分配输入参数?

我正在为计算集群中的帐户创建一些快捷方式。当我提交作业时,系统会为我的计算分配一个作业 ID (JOBID)。为了列出我的所有计算,我创建了一个别名

alias j="queue -u myuser-ID"

输出结果类似如下

         JOBID     NAME     USER     ST       TIME 
      13716868   job_samp   myuserid  R    2:02:55     

然后系统会创建一个名为 job.JOBID 的临时目录,用于存储输出文件。为了访问此目录,我编写了一个函数:

jj() { cd ~/many/many/files/job."$1"; }

它会使用命令“job JOBID”将我带到这个临时文件。为了节省更多击键次数,我想编写另一个函数,该函数通过我的别名“j”获取列出的 JOBID,并将我带到临时文件。当我只有一项工作时,以下函数有效

tt() { r=$(j | awk 'FNR>=2&&NR {print $1}'); jj $r; }

命令“tt”会将我带到该文件。但是,如果我有多个计算(大多数情况下都是这样),最后一个函数就没用了,因为它总是会将我带到列出的第一个作业。我试图做的是将一个变量分配给“tt”函数的 FNR 位,这样当我输入“tt 3”时,它会将我带到第三个作业的目录。我尝试使用 -v 选项,如下所示

tt() { r=$(j | awk -v 'FNR=$2&&NR {print $1}'); jj $r; }

但我收到一条错误消息,指出“FNR”不是合适的变量。我该如何实现它?

提前致谢!

答案1

Awkk 的-v参数是一name=value对,允许你name在 awk 程序中将其用作变量。因此

tt() { r=$(j | awk -v id="$2" 'FNR=id && NR {print $1}'); jj $r; }

(老实说,我不确定为什么这里需要,或者为什么当你只向 awk 传递一个输入(stdin)时&& NR要区分NR和。)FNR

相关内容