【问题标题】:awk printing nothing when used in loop [duplicate]awk在循环中使用时不打印任何内容[重复]
【发布时间】: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 &gt; file.1.a.1.txt 更改为 file.1.a.1.txt &gt; temp &amp;&amp; mv -f temp file.1.a.1.txt -- 您无法重定向到正在处理的文件。
  • 欢迎来到 SO,感谢你的好帖子(它也有代码+输入示例的形式),请继续。如果我们需要将输出保存到 Input_file 本身,您能否告诉我们?你所有的文件扩展名也是.txt吗?
  • @RavinderSingh13 好评论,如果所有文件都可以被某个 glob 识别,那么就不需要循环——当你得到响应时,它会是一个很好的答案,同时也提高了效率任务增加 1000%+
  • 如果sponge 可用,请将&gt; file.1.a.1.txt 替换为| sponge &gt; file.1.a.1.txt
  • 谢谢,所有文件扩展名都是.txt。 David 的解决方案有效,但我仍然不确定为什么原始格式在独立而不是在作业/循环中有效。

标签: linux bash loops awk slurm


【解决方案1】:

您不需要循环,也不能将 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{},您可以删除该节并侥幸:

  1. close() 语句放在print 语句之后(会产生大量开销)
  2. 根本不要打电话给close(),只要您没有很多文件,应该没问题。

【讨论】:

  • 这也对我有用,以及 David R 使用temp &amp;&amp; mv -f temp 的建议。我有大约 1000 个文件,大约 500 万行,只有 2 列;哪种解决方案在运行时方面最好?
  • 好吧,你可以通过调用这两个脚本并在其前面使用内置的time 命令来找出答案。如time /path/to/SiegeX/version.shtime /path/to/your/modified/version.sh。我会说如果我的版本没有更快,我会非常感到惊讶,因为我的版本调用awkone 时间,当您的版本调用 awk 一次时,它会针对它所操作的 每个 文件。
  • P.S.,如果您更新您的问题要求以在没有循环的情况下做您想做的事情以最大限度地提高效率,这个问题可能会重新打开以获得更多答案。
猜你喜欢
  • 2018-01-21
  • 2016-03-02
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2015-04-03
  • 2023-03-12
  • 2017-10-27
  • 1970-01-01
相关资源
最近更新 更多