2017-02-14 60 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