从文本文件中选择特定文本,BASH 脚本
Selecting specific text from text file, BASH scripting
我已经在集群上进行了 运行 模拟,我想通过遍历所有集群节点并复制我需要的所有文件来检查临时结果。
我一直在尝试做的是在键入 qstat -rn u djsavic
:
后从如下所示的文本文件中提取作业 ID 和节点名称作为字符串
fermi:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
-------------------- ----------- -------- ---------------- ------ ----- ------ ------ -------- - --------
59281.fermi djsavic xlarge Smith2 30676 1 2 -- 96:00:00 R 24:19:14
fermi-node08/1+fermi-node08/0
59282.fermi djsavic xlarge Smith2 30686 1 2 -- 96:00:00 R 24:18:56
fermi-node08/3+fermi-node08/2
59283.fermi djsavic xlarge Smith2 30700 1 2 -- 96:00:00 R 24:18:56
fermi-node08/5+fermi-node08/4
59284.fermi djsavic xlarge Smith2 30729 1 2 -- 96:00:00 R 24:21:09
fermi-node08/7+fermi-node08/6
59285.fermi djsavic xlarge Smith2 9076 1 2 -- 96:00:00 R 24:19:24
fermi-node07/1+fermi-node07/0
59286.fermi djsavic xlarge Smith2 9078 1 2 -- 96:00:00 R 24:19:23
fermi-node07/3+fermi-node07/2
59287.fermi djsavic xlarge Smith2 9079 1 2 -- 96:00:00 R 24:19:41
fermi-node07/5+fermi-node07/4
59288.fermi djsavic xlarge Smith2 9080 1 2 -- 96:00:00 R 24:19:57
fermi-node07/7+fermi-node07/6
实际上,列表更长,大约有 80 行。
我需要的是作业 ID 和节点名称,这样我就可以复制文件,例如从目录 fermi-node08/59281/
到一些 /location
在互联网上进行了大量挖掘和搜索之后,到目前为止,我做了这样的事情:
for i in `qstat -rn -u djsavic`; do
for j in `echo $i|grep fermi`; do
echo $j|sed -r 's/(.{12}).*//'|sed 's/.fermi//';
done;
done
我得到的是这样的列表:
fermi:
59281
fermi-node08
59282
fermi-node08
59283
fermi-node08
59284
fermi-node08
59285
fermi-node07
59286
fermi-node07
59287
fermi-node07
59288
fermi-node07
此时,我想将所有 /fermi-node##/JobID/
中的文件复制到所需位置,并从列表顶部删除此 fermi:
。我是 bash 脚本编写的新手,如果有人能帮助我完成最后一步,我将不胜感激。
提前致谢。
awk
救援!
如果您的输入是那种形式(记录分两行)和三行 header,您可以用这个
提取您需要的信息
$ awk 'NR>3{ if(!(NR%2)) {sub(".fermi","",); n=}
else {sub("/.*","",); print "/"n}}' file
fermi-node08/59281
fermi-node08/59282
fermi-node08/59283
fermi-node08/59284
fermi-node07/59285
fermi-node07/59286
fermi-node07/59287
fermi-node07/59288
您可以在 while 循环中使用它进行进一步处理,例如
$ while read f; do echo $f; done < <(awk ...)
只需将 echo $f
替换为您想要执行的操作即可。
更新:如果 header 行不固定,这可能更可靠
$ awk '/^[0-9]*\.fermi/ {sub(".fermi","",); n=; next}
n{sub("/.*","",); print "/"n;n=""}' file
我已经在集群上进行了 运行 模拟,我想通过遍历所有集群节点并复制我需要的所有文件来检查临时结果。
我一直在尝试做的是在键入 qstat -rn u djsavic
:
fermi:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
-------------------- ----------- -------- ---------------- ------ ----- ------ ------ -------- - --------
59281.fermi djsavic xlarge Smith2 30676 1 2 -- 96:00:00 R 24:19:14
fermi-node08/1+fermi-node08/0
59282.fermi djsavic xlarge Smith2 30686 1 2 -- 96:00:00 R 24:18:56
fermi-node08/3+fermi-node08/2
59283.fermi djsavic xlarge Smith2 30700 1 2 -- 96:00:00 R 24:18:56
fermi-node08/5+fermi-node08/4
59284.fermi djsavic xlarge Smith2 30729 1 2 -- 96:00:00 R 24:21:09
fermi-node08/7+fermi-node08/6
59285.fermi djsavic xlarge Smith2 9076 1 2 -- 96:00:00 R 24:19:24
fermi-node07/1+fermi-node07/0
59286.fermi djsavic xlarge Smith2 9078 1 2 -- 96:00:00 R 24:19:23
fermi-node07/3+fermi-node07/2
59287.fermi djsavic xlarge Smith2 9079 1 2 -- 96:00:00 R 24:19:41
fermi-node07/5+fermi-node07/4
59288.fermi djsavic xlarge Smith2 9080 1 2 -- 96:00:00 R 24:19:57
fermi-node07/7+fermi-node07/6
实际上,列表更长,大约有 80 行。
我需要的是作业 ID 和节点名称,这样我就可以复制文件,例如从目录 fermi-node08/59281/
到一些 /location
在互联网上进行了大量挖掘和搜索之后,到目前为止,我做了这样的事情:
for i in `qstat -rn -u djsavic`; do
for j in `echo $i|grep fermi`; do
echo $j|sed -r 's/(.{12}).*//'|sed 's/.fermi//';
done;
done
我得到的是这样的列表:
fermi:
59281
fermi-node08
59282
fermi-node08
59283
fermi-node08
59284
fermi-node08
59285
fermi-node07
59286
fermi-node07
59287
fermi-node07
59288
fermi-node07
此时,我想将所有 /fermi-node##/JobID/
中的文件复制到所需位置,并从列表顶部删除此 fermi:
。我是 bash 脚本编写的新手,如果有人能帮助我完成最后一步,我将不胜感激。
提前致谢。
awk
救援!
如果您的输入是那种形式(记录分两行)和三行 header,您可以用这个
提取您需要的信息$ awk 'NR>3{ if(!(NR%2)) {sub(".fermi","",); n=}
else {sub("/.*","",); print "/"n}}' file
fermi-node08/59281
fermi-node08/59282
fermi-node08/59283
fermi-node08/59284
fermi-node07/59285
fermi-node07/59286
fermi-node07/59287
fermi-node07/59288
您可以在 while 循环中使用它进行进一步处理,例如
$ while read f; do echo $f; done < <(awk ...)
只需将 echo $f
替换为您想要执行的操作即可。
更新:如果 header 行不固定,这可能更可靠
$ awk '/^[0-9]*\.fermi/ {sub(".fermi","",); n=; next}
n{sub("/.*","",); print "/"n;n=""}' file