Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux awk在循环中使用时不打印任何内容_Linux_Bash_Loops_Awk_Slurm - Fatal编程技术网

Linux awk在循环中使用时不打印任何内容

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

我有一堆文件使用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
但是,我需要使用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.上的每个文件调用一次时,如果你更新你的问题要求来做你想做的事情,而没有一个循环来最大化效率,这个问题可能会被重新打开以获得更多的答案。