awk在循环中使用时没有打印任何内容[重复] 。

问题描述 投票:2回答:1

我有一堆使用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,但也没有用。

linux bash loops awk slurm
1个回答
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() 只要你没有 好多 的文件,你应该可以。
© www.soinside.com 2019 - 2024. All rights reserved.