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

その後、最初と6番目の列の情報を取得したいと思います。そのために、私は次のことができると思いました。

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プログラム内ではシェルパラメータ置換は使用できません。

6列目の最初の位置を削除するには、次のようにしますsub()

bjobs -w | awk 'NR > 1 { sub("^[^*]*[*]", "", $6); print $1, $6 }'

*印刷する前に、6番目のフィールドまでのビットを削除して6番目のフィールドを変更します。正規表現は、文字列の先頭にない任意^[^*]*[*]の文字数と一致し、空の文字列に置き換えます。**

上記の質問の出力は次のように変換されます。

821213 pirineus
823954 pirineus4
824083 collserola2
824297 collserola10
824305 collserola5

メモ:以下のすべてのバリエーション(ソリューションを含む)は6番目のフィールドにあると仮定しますsed*。そうでなくても、上記の内容は機能します。

別の方法は、6番目のフィールドを分割し*て2番目の部分を印刷することです。

bjobs -w | awk 'NR > 1 { split($6, a, "[*]"); print $1, a[2] }'

3番目の方法は、スペースとフィールドの区切り*文字を使用することです(フィールド番号付けの変更を参照)。

bjobs -w | awk -F "[[:blank:]*]+" 'NR > 1 { print $1, $7 }'

使用sed:

bjobs -w | sed -nE 's/^([[:alnum:]]+).*\*([[:alnum:]]+).*/\1 \2/p'

おすすめ記事