shell 如何使用第1列的每个唯一值创建slurm数组,并使用第2列中的对应值作为bash脚本的输入

3z6pesqy  于 2023-01-26  发布在  Shell
关注(0)|答案(1)|浏览(151)

在一个表中,我尝试将与每个唯一组(第1列)对应的文件名(第2列)作为输入传递到一个使用唯一的第1列变量创建的slurm数组中。
样表:

$cat table.txt
group1  a.txt
group1  b.txt
group2  c.txt
group2  d.txt
group3  e.txt
group3  f.txt

================================

#!/bin/bash
#SBATCH --array=0-2
#SBATCH -N 1
#SBATCH -c 8
#SBATCH -t 1-

GRP=`awk '{print $1}' table.txt | uniq`
echo $GRP

XYZ=${GRP[$SLURM_ARRAY_TASK_ID]}
echo $XYZ

INPUT=`awk -v x="$XYZ" '$1 == x {print $2}' table.txt`
echo $INPUT

=================================
此处所需的输出是阵列的每个作业中包含两个文件的列表。例如:

a.txt
b.txt

问题:使用变量$XYZ作为模式不会为$INPUT返回任何值,而使用$GRP和$XYZ可以。如果我使用$GRP而不是$XYZ作为$INPUT中的变量,并且在列1中只有一个唯一值,如下所示,它可以工作。

$cat table.txt
group1  a.txt
group1  b.txt

此处的输出为a.txt b.txt
我将appriciate如果有人可以帮助获得类似的输出,为每一组在individual工作的阵列。

0md85ypi

0md85ypi1#

要使GRP成为一个数组,您应该将赋值语句的右边括在括号中,因此:

GRP=(`awk '{print $1}' table.txt | uniq`)

您所做的只是将GRP创建为一个普通变量,因此${GRP[0]}是整个字符串,所有其他索引将返回空。

相关问题