我有一堆使用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,但也没有用。
你不需要循环,也不能将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()
只要你没有 好多 的文件,你应该可以。