[英]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.