【问题标题】:reading values from a comma separated file and passing the values in loops using shell script从逗号分隔的文件中读取值并使用 shell 脚本在循环中传递值
【发布时间】:2021-08-31 12:38:04
【问题描述】:

我有一个配置文件,其中包含以下逗号分隔值。

jobA,table1,table2,table3
jobB,table4,table5,table6,table7
jobC,table8,table9

现在我想读取第 1 行的第一列,即一个变量中的 $1(jobA),并将相应作业的所有表 (table1,table2,table3) 作为列表读取在单独的变量中,并在循环中迭代此列表。类似的事情应该一直持续到文件结束,即jobN ..我尝试了下面的代码但没有奏效。我是新手,任何建议都会很有帮助。

#!/bin/bash
JOBS=$(awk -f\, '(print $1}' a.config)
declare -p JOBS
for jobs in "${List[@]}"
  do
    if [[somecondition]];then
    else
    fi
    TABLES=$(awk -f\, '{for(i=2;i<=NF;++i)print $i}' a.config)
    declare -p TABLES
    for tables in ${list[@]}
      do
        if [[somecondition]];then
        else
        fi
    done 
done
exit 0;

【问题讨论】:

  • edit您的问题并添加更多详细信息。优普需要什么条件和处理?也许显示您的示例输入的预期输出。在awk 脚本中进行所有处理可能很容易。
  • 您可以在一次调用awk 中完成您需要的一切——而不是在循环中调用awk。您可以轻松读取每行的第一个字段,然后从第二个到最后一个 ($NF) 字段进行迭代。重要的是您需要对每个字段做什么。

标签: linux bash shell unix scripting


【解决方案1】:
while read line; do
    job_name=$(echo "$line"|awk 'BEGIN{FS=","}{print $1}')
    echo "JobName is $job_name"
    # remove the jobname from the string
    tablestring=${line#"$job_name"}
    # Iterate over the remaining string
    for table in ${tablestring//,/ }; do
        echo $table
    done
done<jobfile

输出:

$ bash script.sh
JobName is jobA
table1
table2
table3
JobName is jobB
table4
table5
table6
table7
JobName is jobC
table8
table9

【讨论】:

  • awk -F',' '{ print "JobName is " $1; for (i=2;i&lt;=NF;i++) print $i }' file 也可以。
  • 嗨 abhishek.. 感谢您的帮助。我尝试了完全相同的代码.. 它只打印第一行,即第一行中的 job1 和相应的表,而不是从第二行打印作业和表名称
  • 你能把你拥有的文件的内容贴出来
  • @David C 我认为他会在循环中执行一些步骤,所以我认为这会更容易。一个赞成票,因为这确实有效:)
  • 嗨@abhishekphukan ..内容与我在问题中保留的内容相同..不知道为什么只选择第一行
猜你喜欢
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 2012-06-13
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多