我有两个这样的文件:
文件A:
Name,Site Name,Product UPEI,Product Name,NMS Flag,Product Model, SW
文件B:
NE_Name SW
ABC 4.4
ASD 4.3
... ...
请注意,fileA 仅由一行组成,并且具有多个标头(例如,名称、站点名称等)。而 fileB 有 2 个行数巨大的字段。
我想将这两个文件组合起来:
输出文件:
Name,Site Name,Product UPEI,Product Name,NMS Flag,Product Model, SW
ABC,,,,,,4.4
ASD,,,,,,4.3
因此,输出文件将具有 fileA 中存在的所有标头,并将扩展字段:“Name”(使用从 fileB 获取的“NE_Name”值)和“SW”(使用从 fileB 获取的“SW”值)。
如何从上面提到的 2 个输入文件中获取这个输出文件?
答案1
这是一种方法awk
:
$ awk -F, 'NR==1{nf=NF-1; print $0; FS=" "} \
NR>2{printf("%s%.*s%s\n",$1,nf,",,,,,,,,,,,,,,,,,",$2)}' fileA fileB
Name,Site Name,Product UPEI,Product Name,NMS Flag,Product Model, SW
ABC,,,,,,4.4
ASD,,,,,,4.3
关键部分是printf
我们打印 fileB 中的第一个和第三个字段,并用,
从第一个文件中获取的数字分隔nf=NF-1
。
答案2
tail -n+2 fileB | sed -r 's/[[:space:]]+/,,,,,,/' | cat fileA - > Output
说明
tail -n +2 fileB
从第二行开始写入 fileB 的末尾,因为我们想忽略第一行。
sed
,使用-r, --regexp-extended
(表示+
元字符含义 '最后一个') 将第一组空格字符替换为示例中预期的逗号数量。
cat
最后连接 fileA 和通过管道接收的数据sed
(称为 )-
,并将其写入,该数据根据您的请求stdout
重定向到文件。Output
局限性
如果 NE_Name 或 SW 列中有空格字符,则不起作用。
答案3
另一种sed
方法:
$ sed 's/ */,,,,,,,/;/NE_/d' fileA fileB
Name,Site Name,Product UPEI,Product Name,NMS Flag,Product Model, SW
ABC,,,,,,,4.4
ASD,,,,,,,4.3
第一个sed
命令用 7 个逗号替换 3 个或更多空格,第二个命令删除任何匹配的行NE_
。