2016-09-27 48 views
0

我有一个变量,其中包含其他几个变量的名称列表。这些变量都包含一个表格。我想加入所有这些表格。bash:加入多个变量的内容

该表时会是这个样子:

Name Average  Name Average 
A 1    A 1.1 
B 2    B 2.2 
C 3    C 3.3     etc. 
D 4    D 4.4 
E 5    E 5.5 

我的变量名的列表被称为$ all_variables和这里是它的内容看起来像(在现实情况下多了很多变数):

echo "$all_variables" 

$table1 
$table2 
$table3 
$table4 
$table5 

要创建的连接功能的参数列表中,我创建了$ all_variables_join,其中包含了加入函数的参数:

echo "$all_variables_join" 

<(echo "$table1") <(echo "$table2") <(echo "$table3") <(echo "$table4") <(echo "$table5") 

那么我想运行加入(基于第一列,所以我使用默认选项),使用这样的事情:

join "$all_variables_join" > file.txt 

这将扩大到

join <(echo "$table1") <(echo "$table2") <(echo "$table3") <(echo "$table4") <(echo "$table5") > file.txt 

而且file.txt的会包含这样的事情:

Name Average  
A 1 1.1 
B 2 2.2 
C 3 3.3   etc...   
D 4 4.4 
E 5 5.5 

然而,当我尝试运行此我得到这个错误:

join "$all_variables_join" > file.txt 

join: missing operand after `<(echo "$table1") <(echo "$table2") <(echo "table3") <(echo "$table4") <(echo "$table5")' 
Try `join --help' for more information. 

任何想法如何解决这个问题?

任何帮助非常感谢!

感谢

编辑:修正了错误信息,我已经抄错一个

+1

目前还不清楚你想要做什么。听起来像是一个XY问题:对您的问题可能有完全不同的解决方案。 – choroba

+0

基本上我可以减少这一点,说我想从一个变量调用连接参数。加入“$ all_variables_join”> file.txt将被扩展为加入<(echo“$ table1”)<(echo“$ table2”)等 – arielle

+0

扩展似乎运作良好,我只是不明白为什么我得到这个错误消息 – arielle

回答

0

@giles和@ccarton指出,你需要脱掉双引号$all_variables。这里是说明为什么一个例子:

touch 1 
touch 2 
x='1 2' 
ls $x 
ls "$x" 

不过,这不会解决你的问题,因为,作为@ccarton说,join只接受两个文件在同一时间。

一个战略,将工作将是创建一个包含所有可能的名称的列(A,B,C ...):

table=$(echo -e "$table1\n$table2\n$table3\n$table4\n$table5" | 
    tail -n+2 | 
    awk '{print $1}' | 
    sort -u) 

,然后在每个表一个接一个连接:

table=$(join -a1 <(echo "$table") <(echo "$table1")) 
table=$(join -a1 <(echo "$table") <(echo "$table2")) 
table=$(join -a1 <(echo "$table") <(echo "$table3")) 
table=$(join -a1 <(echo "$table") <(echo "$table4")) 
table=$(join -a1 <(echo "$table") <(echo "$table5")) 

,可以使用一个循环,而不是明确指定表1 ......表5-1,但它是最自然的这样做,如果数据是文件,而不是变量,例如,

mkdir /tmp/tables 
echo "$table1" > /tmp/tables/table1 
... 
echo "$table5" > /tmp/tables/table1 
for t in /tmp/tables/*; do 
    table=$(join -a1 <(echo "$table") $f) 
done 

关于join的两个注意事项:1.即使没有右表中的匹配,-a也会保留该行。 2。钥匙必须被排序,如果他们不是已经:

table=$(join -a1 <(echo "$table") <(sort -k1 $f))