Linux awk在循环中使用时不打印任何内容
我有一堆文件使用file.1.a.1.txt格式,如下所示:Linux awk在循环中使用时不打印任何内容,linux,bash,loops,awk,slurm,Linux,Bash,Loops,Awk,Slurm,我有一堆文件使用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 但是,我需要使用sbatc
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
但是,我需要使用sbatch提交将多个文件作为HPC上的作业来执行此操作。但当我运行以下作业脚本时:
#!/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
#/bin/bash
#
#SBATCH--数组=1-10
N=$SLURM\u数组\u任务\u ID
对于j in{a,b,c};
做
对于{1,2,3}中的i
执行awk“{print FILENAME(NF?”\t):“)$0}”文件。${N}.$j”。“$i.txt>文件。${N}.$j”。$i.txt
完成
完成
awk正在生成空文件。我曾尝试使用cat调用该文件,然后通过管道将其传输到awk,但也没有成功。您不需要循环,也无法将STDOUT重定向到从STDIN读取的同一文件,如果这样做,您将得到空白文件 试试这个:
#!/bin/bash
N=$SLURM_ARRAY_TASK_ID
awk '
NF{
print FILENAME "\t" $0 > FILENAME".tmp"
}
ENDFILE{ # requires gawk
close(FILENAME".tmp")
}' file."$N".{a,b,c}.{1,2,3}.txt
for file in file*.tmp; do
mv "$file" "${file%.tmp}"
done
请注意,如果您没有GNU来使用ENDFILE{}
,那么您可以删除该节,并通过以下任一方式解决:
close()
语句放在print
语句之后(会带来很多开销)close()
,只要你没有太多的文件,你就可以了将
file.1.a.1.txt>file.1.a.1.txt
更改为file.1.a.1.txt>temp&&mv-f temp file.1.a.1.txt
——您无法重定向到正在处理的文件。欢迎访问,很好的帖子(也有代码+输入示例形式的努力),请继续。您能告诉我们是否需要将输出保存到输入文件中吗?另外,您的所有文件扩展名是否都是.txt
?@RavinderSingh13如果所有文件都可以通过一些glob来识别,那就好了,这样就不需要循环了——当您得到响应时,它将是一个很好的答案,同时还可以将任务的效率提高1000%+将.1.a.1.txt
替换为|海绵>文件.1.a.1.txt
,如果海绵
可用。谢谢,所有文件扩展名都是.txt
。David的解决方案奏效了,尽管我仍然不确定为什么原始格式在单机版中有效,而不是在作业/循环中有效。这对我也有效,同时David R建议使用temp&&mv-f temp
。我有约1000个文件,行数约5米,列数仅为2列;关于运行时,哪种解决方案是最好的?好吧,您可以通过在脚本前面使用内置的time
命令调用这两个脚本来找到答案。如time/path/to/SiegeX/version.sh
和time/path/to/your/modified/version.sh
。我会说,如果我的速度不快,我会非常惊讶,因为我的版本只调用一次,当你的版本对它运行在.P.S.上的每个文件调用一次时,如果你更新你的问题要求来做你想做的事情,而没有一个循环来最大化效率,这个问题可能会被重新打开以获得更多的答案。