![如何为包括 awk 在内的函数分配输入参数?](https://linux22.com/image/914642/%E5%A6%82%E4%BD%95%E4%B8%BA%E5%8C%85%E6%8B%AC%20awk%20%E5%9C%A8%E5%86%85%E7%9A%84%E5%87%BD%E6%95%B0%E5%88%86%E9%85%8D%E8%BE%93%E5%85%A5%E5%8F%82%E6%95%B0%EF%BC%9F.png)
我正在为计算集群中的帐户创建一些快捷方式。当我提交作业时,系统会为我的计算分配一个作业 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