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