awk 行内的参数操作

awk 行内的参数操作

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

相关内容