将命令的输出写入 csv 文件的特定列,unix

Writing the output of a command to specific columns of a csv file, unix

我想将命令的输出写入 csv 文件的特定列(第 3 和第 5)。

#!/bin/bash
echo -e "Value,1\nCount,1" >> file.csv
echo "Header1,Header2,Path,Header4,Value,Header6" >> file.csv
sed 'y/ /,/' input.csv >> file.csv

input.csv 上面的片段看起来像这样

1234567890 /training/folder
0325435287 /training/newfolder

file.csv

的当前输出
Value,1
Count,1
Header1,Header2,Path,Header4,Value,Header6
1234567890,/training/folder
0325435287,/training/newfolder

file.csv

的预期输出
Value,1
Count,1
Header1,Header2,Path,Header4,Value,Header6
,,/training/folder,,1234567890,
,,/training/newfolder,,0325435287,

您可以使用 awk 而不是 sed

cat input.csv | awk '{print ",,"  ","  ","}' >> file.csv

awk 可以逐行处理标准输入。它实现了一个打印功能,每个单词都作为参数处理(在您的例子中,</code> 和 <code>)。在上面的示例中,我添加了 ,,, 作为内联参数。

您可以在 sed 脚本中轻松添加空列。

sed 'y/ /,/;s/,/,,/;s/^/,,/;s/$/,/' input.csv >> file.csv

这会将第一个逗号替换为两个,然后在前面添加两个,在末尾添加一个。

不过,您的预期输出看起来不像有效的 CSV。这也很脆弱,因为它对于包含 space 或逗号的任何文件名都会失败。

使用 sed 您可以尝试以下代码。这是使用 sed 的反向引用功能。

sed -E 's/(^[^ ]*) +(.*$)/,,,,,/' Input_file

说明:使用sed-E选项首先启用ERE(扩展正则表达式)。然后在主程序中使用s选项进行替换操作。在替换的第一部分创建 2 个反向引用(能够通过使用正则表达式捕获值并将它们保存在临时缓冲区内存中以供稍后在替换的第二部分替换它时使用)。在替换的第二部分,用 2 个逗号替换整行,然后是第二个捕获组 </code>,然后是 2 个逗号,然后是第一个捕获组 <code>,然后是 ,

所有操作都可以一次完成awk:

awk -v OFS=, -v pre="Value,1\nCount,1" -v hdr="Header1,Header2,Path,Header4,Value,Header6" '
   BEGIN {print pre; print hdr}
   {print "", "", , "", , ""}
' input.csv

Value,1
Count,1
Header1,Header2,Path,Header4,Value,Header6
,,i1234567890,,/training/folder,
,,0325435287,,/training/newfolder,