2016-09-27 68 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))