2017-09-10 198 views
0

我會如何將多個CSV文件逐列合併。我所記錄的是從網頁上抓取的公司的圖表位置。只有第一個文件有兩列,位置1到100,第二列包含公司名稱。所有其他文件只有一列;只保留公司名稱。現在我想合併這些如下所述。 Mac/Linux解決方案是首選。我可以寫Bash,一個小小的JavaScript,但Perl並不是我的特長。按列合併多個CSV文件

1.csv

position,name 
1,microsoft 
2,apple 
3,google 

和其他各種文件,它們的日期命名的,看起來像這樣:

2.csv

name 
microsoft 
apple 
google 

3.csv

name 
apple 
microsoft 
google 

合併後的版本是這樣的:

position,name,name,name 
1,microsoft,microsoft,apple 
2,apple,apple,microsoft 
3,google,google,google 

唯一的解決方案,我可以找到,只需添加(或連接)的內容層出不窮,這是不是我要找的。

+0

的可能的複製[如何連接兩行文件逐行使用bash](https://stackoverflow.com/questions/3806874/how-to-concatenate-two-files-line-by-line-using-b灰)這不是你要找的東西?最終的結果正是你想要的?! param'-d「,」'當然是(https://ss64.com/bash/paste.html) – Jakumi

回答

0

下面是使用jq的解決方案。如果filter.jq包含以下過濾器:

def parse: 
    reduce (inputs 
     | {f:input_filename, r:split(",")} 
     | select(.r|length>0) 
) as $i (
    {} 
    ; .[$i.f] += [$i.r] 
) 
; 

def reorg: 
    range([ map_values(length)[] ] | max) as $r 
    | [ .[] | .[$r] // [range(.[0]|length)|""] | .[] ] 
; 

parse | reorg | join(",") 

和文件1.csv2.csv3.csv包含樣本數據則命令

$ jq -Rrn -f filter.jq 1.csv 2.csv 3.csv 

產生

position,name,name,name 
1,microsoft,microsoft,apple 
2,apple,apple,microsoft 
3,google,google,google