将命令的输出写入 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,
我想将命令的输出写入 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,