【发布时间】:2020-10-01 10:28:32
【问题描述】:
我有一堆文件格式如下:file.1.a.1.txt:
A 1
B 2
C 3
D 4
并且正在使用以下命令添加一个包含每个文件名称的新列:
awk '{print FILENAME (NF?"\t":"") $0}' file.1.a.1.txt > file.1.a.1.txt
最终让它们看起来像我想要的那样:
file.1.a.1.txt A 1
file.1.a.1.txt B 2
file.1.a.1.txt C 3
file.1.a.1.txt D 4
但是,我需要在 HPC 上使用 sbatch 提交对多个文件执行此操作。但是当我运行以下作业脚本时:
#!/bin/bash
#<other SBATCH info>
#SBATCH --array=1-10
N=$SLURM_ARRAY_TASK_ID
for j in {a,b,c};
do
for i in {1,2,3}
do awk '{print FILENAME (NF?"\t":"") $0}' file.${N}."$j"."$i".txt > file.${N}."$j"."$i".txt
done
done
awk 正在生成空文件。我曾尝试使用 cat 调用该文件,然后将其通过管道传输到 awk ,但这也没有奏效。
【问题讨论】:
-
将
file.1.a.1.txt > file.1.a.1.txt更改为file.1.a.1.txt > temp && mv -f temp file.1.a.1.txt-- 您无法重定向到正在处理的文件。 -
欢迎来到 SO,感谢你的好帖子(它也有代码+输入示例的形式),请继续。如果我们需要将输出保存到 Input_file 本身,您能否告诉我们?你所有的文件扩展名也是
.txt吗? -
@RavinderSingh13 好评论,如果所有文件都可以被某个 glob 识别,那么就不需要循环——当你得到响应时,它会是一个很好的答案,同时也提高了效率任务增加 1000%+
-
如果
sponge可用,请将> file.1.a.1.txt替换为| sponge > file.1.a.1.txt。 -
谢谢,所有文件扩展名都是
.txt。 David 的解决方案有效,但我仍然不确定为什么原始格式在独立而不是在作业/循环中有效。
标签: linux bash loops awk slurm