bjobs -w
当我在工作的机器上运行时,我得到下一个输出:
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME
821213 user1 RUN parallel16 hpc2 16*pirineus NAME1111 Apr 9 20:26
823954 user1 RUN parallel16 hpc1 5*pirineus4 NAME2222 Apr 11 22:45
824083 user1 RUN parallel16 hpc1 16*collserola2 otherthing Apr 12 19:20
824297 user1 RUN parallel16 hpc1 8*collserola10 another_long_name Apr 13 20:50
824305 user1 RUN parallel16 hpc2 16*collserola5 Try_anothername Apr 14 12:16
然后,我想获取第一列和第六列的信息。为此,我想我可以这样做
bjobs |awk '(NR>=2) {print $1 " "$6 }'
但后来,我得到
821213 16*pirineus
823954 5*pirineus
824083 16*collsero
824297 8*collsero
824305 16*collsero
当我想得到
821213 pirineus
823954 pirineus4
824083 collsero2
824297 collsero10
824305 collsero5
我尝试了下一个命令(遵循使用参数操作的想法),但它给了我一个错误。
bjobs |awk '(NR>=2) {print $1" " ${6#* *} }'
awk: (NR>=2) {print $1" " ${6#* *} }
awk: ^ syntax error
awk: línea ord.:1: (NR>=2) {print $1" " ${6#* *} }
awk: línea ord.:1: ^ syntax error
关于如何解决这个问题有什么想法吗?
答案1
您不能在awk
程序内使用 shell 的参数替换。
要删除第六列的第一位,请使用sub()
:
bjobs -w | awk 'NR > 1 { sub("^[^*]*[*]", "", $6); print $1, $6 }'
*
这将通过在打印之前删除直到第六个字段的位来修改第六个字段。正则表达式^[^*]*[*]
匹配任意数量的不在*
字符串开头的字符,然后是*
.然后将其替换为空字符串。
上面将问题中的输出转换为
821213 pirineus
823954 pirineus4
824083 collserola2
824297 collserola10
824305 collserola5
笔记:下面的所有变体(包括解决方案)都假设第六个字段中sed
有一个*
。即使没有,上面的方法也会起作用。
另一种方法是拆分第六个字段*
并打印第二部分:
bjobs -w | awk 'NR > 1 { split($6, a, "[*]"); print $1, a[2] }'
第三种方法是使用空格 和*
作为字段分隔符(注意字段编号的变化):
bjobs -w | awk -F "[[:blank:]*]+" 'NR > 1 { print $1, $7 }'
使用sed
:
bjobs -w | sed -nE 's/^([[:alnum:]]+).*\*([[:alnum:]]+).*/\1 \2/p'
答案2
我使用下面的命令来获得所需的输出
awk 'NR >=2{print $1,$6}' example.txt | sed "s/[0-9]\{1,2\}\*//g"
输出
821213 pirineus
823954 pirineus4
824083 collserola2
824297 collserola10
824305 collserola5