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'
答え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