簡體   English   中英

在多個csv文件中映射文件並組合行

[英]Map fileds in multiple csv files and combine the rows

我的第一個csv文件中的數據是:

ID, name, city
1, John, NYC
2
3
4, Sam, SFO
5 

在第二個csv文件中

ID, name, city
3, Tim, STL
2, Daniel, BOS

第三個csv文件

ID, name, city
5, Eric, AST

我想要一個帶有聚合數據的單個csv文件:

ID, name, city
1, John, NYC
2, Daniel, BOS
3, Tim, STL
4, Sam, SFO
5, Eric, AST 

我試圖用awk做這個,但我是初學者,所以我想不出辦法做到這一點。 任何指針都會有所幫助。

在輸出中,我們禁止無名稱記錄和標題,然后按ID排序:

$ (head -1 1st.csv
   awk -F, 'NF > 2 && FNR > 1' {1st,2nd,3rd}.csv | sort -n ) | tee combined.csv

假設CSV中的數據與您在上面共享的數據相同。

cat f1.csv f2.csv f3.csv|awk -F',' '$2!="" && $3!=""'

請在單個awk中嘗試以下操作,並告訴我這是否對您有所幫助。

awk -F, 'NR==1{print;next}FNR>1{a[$1]=NF>1 && a[$1]?a[$1] FS $0:(NF>1?$0:"")} END{for(i in a){if(a[i]){print a[i] | "sort"}}}' 1.csv 2.csv 3.csv

輸出如下。

ID, name, city
 1, John, NYC
 2, Daniel, BOS
 3, Tim, STL
 4, Sam, SFO
 5, Eric, AST

它應該工作超過3個文件,只有它超過打開文件的限制然后為了避免任何too many files opened錯誤,我們必須運行以下代碼。

awk -F, '
NR==1{
  print;
  next
}
FNR==1{
  if(val){
    close(val)
};
  val=FILENAME
}
FNR>1{
  a[$1]=NF>1 && a[$1]?a[$1] FS $0:(NF>1?$0:"")
}
END{
  for(i in a){
    if(a[i]){
     print a[i] | "sort"
}}
}
' 1.csv 2.csv 3.csv
$ cat f1
ID, name, city
1, John, NYC
2
3
4, Sam, SFO
5 

$ cat f2
ID, name, city
3, Tim, STL
2, Daniel, BOS

$ cat f3
ID, name, city
5, Eric, AST

$ awk -F, 'FNR==1{i++}i<3{a[$1+0]=$0;next}i==3 && $1+0 in a{print a[$1+0];next}1' f2 f3 f1
ID, name, city
1, John, NYC
2, Daniel, BOS
3, Tim, STL
4, Sam, SFO
5, Eric, AST

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM