2017-02-14 61 views
1

我有一個腳本:如何在腳本中遞歸應用粘貼命令

paste -d, <(cut fileA1 -d, -f1-6) <(cut fileB1 -d, -f7) > fileC1 

它有兩個csv文本文件fileA1fileB1,副本fileA1第6列它們粘貼(帶替換)成前6列fileB1。輸出然後保存到一個新的文件fileC1。現在

,我想這folder AfileA1...fileAn)和folder BfileB1...fileBn)擴展到N個文件和輸出文件保存到folder CfileC1...fileCn)。 所有輸入文件都有相同的行數。

我想出了這個

fileA1=find /path/to/folderA -name '.csv' 
fileB1=find /path/to/folderB -name '.csv' 

paste -d, <(cut fileA1 -d, -f1-6) <(cut fileB1 -d, -f7) > *.csv 

但它不工作。有任何想法嗎?

+0

請注意'cut'和'paste'不是首先用於處理CSV文件的最佳工具。他們無法正確處理包含逗號字段的記錄。 – chepner

回答

2

您需要一個顯式循環。它看起來並不像您使用的任何功能find無法在shell中完成,因此我將跳過它。

a_files=(/path/to/folderA/*.csv) 
b_files=(/path/to/folderB/*.csv) 

接下來,我將假設您的文件名是這樣的,兩個數組是同步的;每一個的第一個元素放在一起等等。

for ((i=0; i<"${#a_files[@]}"; i++)); do 
    paste -d, <(cut "${a_files[i]}" -d, -f1-6) \ 
       <(cut "${b_files[i]}" -d, -f7-) > fileC"$i".csv 
done 

在這裏,我假設輸出文件的名稱可以像這樣構造。 (這也意味着你可能能夠對輸入文件做同樣的事情;這裏唯一的變量將是i迭代的範圍0-n。)

+0

感謝您對@chepner的貢獻。它改變了一些:「$ {a_files [@]}」更改爲'「$ {#a_files [@]}」'和'(cut「$ {b_files [i]}」-d,-f1-7 )'改爲'(削減「$ {b_files [i]}」-d,-f7-)'。如果沒有第二次更改,fileC只包含A和B的前6列和7列。劇本僅需10分鐘即可處理200MB的200個文件! – Buzz

+0

謝謝,我已將這些更改納入答案中;第一個是拼寫錯誤,第二個是由於我沒有仔細閱讀原始代碼。 – chepner