2017-07-01 48 views
0

我的目錄中有四個文件:say a.txt; b.txt; c.txt; d.txt。我想加入所有其他文件基於兩個公共列的每個文件(即加入與b.txt,c.txt和d.txt a.txt;與a.txt,c.txt和d加入b.txt。 txt;加入c.txt與a.txt,b.txt和d.txt)。爲了兩個我可以做的文件這樣做:基於目錄中所有文件的兩列加入文件

join -j 2 <(sort -k2 a.txt) <(sort -k2 b.txt) > a_b.txt

我怎樣寫這個在目錄中的所有文件的循環?我試過了下面的代碼,但那不起作用。

for i j in *; do join -j 2 <(sort -k2 $i) <(sort -k2 $j) > ${i_j}.txt

任何幫助/方向將是有益的!謝謝。

回答

0

這可能是一個辦法做到這一點:

#!/bin/bash 


files=(*.txt) 


for i in "${files[@]}";do 

    for j in "${files[@]}";do 

     if [[ "$i" != "$j" ]];then 

      join -j 2 <(sort -k2 "$i") <(sort -k2 "$j") > "${i%.*}_$j" 

     fi 

    done 

done 
+0

這工作得非常好!非常感謝。你能澄清1)爲什麼你將文件聲明爲一個數組,而不僅僅是「for i in」$ {files}「; do'和2)爲什麼你有一個名爲'」的o/p文件$ {i% 。*} _ $ j「'而不是」$ {i%。* _ $ j}「?我嘗試了上述兩個更改,但只有您的方法有效。 – aram

+0

1)數組的使用是預先使文件循環。因爲我們在循環內部創建文件,所以如果我們只是使用'for i in * .txt'或'files = *。txt',第二個循環會選取新創建的文件。如果使用'「$ {files}」',則只能訪問數組的第一個元素。 2)''$ {i%。*} _ $ j「'是使用bash子串刪除,這是爲'$ i'刪除'.txt'。以下是一些示例:https://stackoverflow.com/q/16623835/2002514 – archemiro

+0

如果您事先對文件進行排序並循環訪問已排序的文件,則可以對此進行優化。它的方式增加了很多額外的工作,因爲我們在循環訪問時一次又一次地排序相同的文件。 – archemiro