我有包含所有列的 datafile.csv
col1^col2^col3^col4^col5..^up-to col'n'
如何读取 extractfile.csv 中包含 columnName^Value 的每一行数据
样本数据:
Row1:
col2^NY
col1^2017
col3^17:50
col5^Robert
Row2:
col2^NJ
col1^2015
col4^BMW|i8
col5^Cable,Mathew
并将值放在 datafile.csv 中相应列下,其中 (extractfile.csv[$columname]=datafile.csv[$columname])
预期输出:
col1^col2^col3^col4^col5..^col'n'
2017^NY^17:50^null^Robert^..^null^
2015^NJ^null^BMW|i8^Cable,Mathew^..^null^
笔记:如果某列没有数据,则应在 output.csv 中将该字段设置为 null。分隔符是 ^。
提前致谢。
答案1
awk -F"^" '
NR==1{
col=split($0,H)
print
next
}
/:$/{
C[++i] = $0
}
NF > 1{
D[C[i],$1] = $2
}
END{
for(c in C)
for(h in H)
val = "null"
if(D[C[c],H[h]])
val = D[C[c],H[h]]
if(h < col)
printf "%s" FS, val
else
print val
}
' datafile.csv extractfile.csv
产生的
col1^col2^col3^col4^col5^col'n'
2017^NY^17:50^null^Robert^null
2015^NJ^null^BMW|i8^Cable,Mathew^null
答案2
一种略有不同的方法。调用它awk -v RS="" -v n=6 -f myprog datafile.csv
:
BEGIN {
for (i = 1; i <= n; i++) {
result = result "^col" i;
}
print substr(result, 2);
}
{
delete data;
for (i = 2; i <= NF; i++) {
split($i, d, "^");
data[d[1]] = d[2];
}
result = "";
for (i = 1; i <= n; i++) {
value = data["col"i];
if (value) {
result = result "^" value;
} else {
result = result "^null";
}
}
print substr(result, 2);
}