【问题标题】:Shell || Adding element to array separated by line not space壳牌 ||将元素添加到由行而不是空格分隔的数组
【发布时间】:2015-08-23 12:42:40
【问题描述】:

我正在循环读取一个文件,每次迭代都有一个字符串。我需要将此元素添加到数组中,但在新行中

我使用打击 cmd ARRAYNAME+=$ELEMENTNAME

但是会发生什么,该元素被添加到最后一个元素中,但用“”而不是行分隔

while IFS='' read -r line || [[-n "$line" ]];do
MAPPING=`echo $line | grep -e session -e sub | cut -d: -f3 | grep -i ","`
MAPPINGMAT+=("$MAPPING")
echo ${MAPPINGMAT[*]}
done < "$1"

输出

1
1 2
1 2 3

但我需要它

1
2
3

【问题讨论】:

  • 您分配给MAPPING 的行无效我不认为,因为grep -i 需要一个模式,那么您不会在数组中添加整行,并且您告诉循环在循环的每次迭代中将整行打印在一行上。在while循环之后使用我的答案中的for循环让它在自己的行上打印每个元素
  • grep -i 更新我错过了,我认为 for 应该可以工作,但它会在大文件中做很多处理,因为已经有 while 循环所以我试图避免它
  • 如果您在循环的每次迭代中将整个数组打印在一行上,您将获得您报告的输出,除非您改变您的方式,否则无法获得不同的输出打印它。将其添加到数组的方式不是输出问题的一部分,而是生成输出的方式。如果您不想在之后使用单独的循环来打印数组,您可以只在while 中使用echo $MAPPING 而不是每次都打印整个数组
  • 你所说的就是我所做的。 echo $MAPPING 在 while 循环内完成。我只需要将 MAPPING 的输出添加到数组的单独行中。读取数组应该在while循环之外,这里只是为了跟踪
  • 那么我的答案或 deepmax 的答案不起作用怎么办?如果您正在迭代数组元素,那里没有“线”的概念,只有元素,您可以在元素周围插入您喜欢的线。我们的两个答案听起来都像是在做你要求我做的事情

标签: linux bash shell unix command


【解决方案1】:

使用括号:

ARRAYNAME+=("$ELEMENTNAME")

将项目附加到ARRAYNAME 的末尾。

你看到下面输出的原因

1
1 2
1 2 3

是您在每次迭代的循环中打印整个数组。因此echo ${MAPPINGMAT[*]} 不应该在循环中。将其替换为简单的echo "$MAPPING"

【讨论】:

    【解决方案2】:

    使用括号和引号,我将整行作为数组元素得到,如下所示:

    declare -a arr
    while read -r line; do
        arr+=("$line")
    done < input
    

    然后我得到arr 中的每一行,如下所示:

    for(( i=0; i<${#arr[@]}; i++ )); do
        echo ${arr[$i]}
    done
    

    【讨论】:

    • 我的脚本如下,而 IFS='' 读取 -r 行 || [[-n "$line" ]];do MAPPING=echo $line | grep -e session -e sub | cut -d: -f3 | grep -i MAPPINGMAT+=("$MAPPING") echo ${MAPPINGMAT[*]} done
    • 很难在评论中遵循该脚本,您能否编辑您的问题以包含它?
    • bash 4中,这个循环可以替换为readarray -t arr &lt; input
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多