在Bash中连接字符串

5
一个程序的输出设置为2位小数浮点数,每行一个。根据执行情况,可以输出许多文件,每个文件名为cancer.ex#,其中#是从脚本执行程序的次数。
教授提供了一个awk脚本作为生成95%置信度图表使用gnuplot的第一步。我想将输出转换为以下格式:
conf $1 $2 $3 var#
其中#是来自cancer.ex#的数字。
我已经开发了以下内容:
#!/bin/bash
Files=Output/*
String

for f in $Files 
do
    String="conf "
    cat $f | while read LINE
    do
        String="$LINE "
    done
echo $String
done

我知道一些步骤还没有完善,因为我刚刚开始整理这个。我的问题在于执行连接部分时,它根本不起作用。当执行上面的脚本时,没有输出,什么也没有。然而,如果我将String="$LINE更改为echo $LINE,那么我就可以在终端上得到所有文件的输出。

在bash中,是否有可行的追加变量的函数来处理循环内的内容?

1个回答

7
#!/bin/bash
Files=( Output/* )
String

for f in "${Files[@]}"
do
    String="conf "
    while read LINE
    do
        String+="$LINE "
    done < "$f"
echo $String
done

使用< "$f"而不是管道cat $f的微妙差别在于,由于管道,while循环将在子shell中执行,并且因为子shell的原因,for循环中的变量实际上不会被更新。

还要注意,在各个关键点上,我使文件名处理更加健壮(例如接受带有空格的文件名)。

开箱即用?

所有这些都说了,我猜您只需要使用以下命令即可完成:

String="conf $(cat Output/*)"
#
String="$(for a in Output/*; do echo "conf $(cat "$a")"; done)"

使用虚拟数据的概念验证:

mkdir Dummy
for a in {a..f}; do for b in {1..3}; do echo $a $b; done > Dummy/$a; done
for a in Dummy/*; do echo "conf " $(cat $a); done

输出

conf  a 1 a 2 a 3
conf  b 1 b 2 b 3
conf  c 1 c 2 c 3
conf  d 1 d 2 d 3
conf  e 1 e 2 e 3
conf  f 1 f 2 f 3

就这些了,非常感谢。我会记得包含健壮性,尽管由于硬编码实现,这个特定的脚本并不需要它。 - Jason
@Jason:我包含了一行代码的版本,我认为(在第三次阅读后...)最适合您想要做的事情,并附带示例输出 :) - sehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接