将命令的输出写入 csv 文件的特定列,unix
Posted
技术标签:
【中文标题】将命令的输出写入 csv 文件的特定列,unix【英文标题】:Writing the output of a command to specific columns of a csv file, unix 【发布时间】:2021-12-23 16:41:15 【问题描述】:我想将命令的输出写入 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
上面 sn-p 中的 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,
【问题讨论】:
相对而言,您通常更喜欢printf
而不是 echo -e
,即使在 Bash 脚本中也是如此。
【参考方案1】:
所有操作都可以在一个awk
中完成:
awk -v OFS=, -v pre="Value,1\nCount,1" -v hdr="Header1,Header2,Path,Header4,Value,Header6" '
BEGIN print pre; print hdr
print "", "", $1, "", $2, ""
' input.csv
Value,1
Count,1
Header1,Header2,Path,Header4,Value,Header6
,,i1234567890,,/training/folder,
,,0325435287,,/training/newfolder,
【讨论】:
【参考方案2】:使用sed
,您可以尝试以下代码。这是使用sed
的反向引用能力。
sed -E 's/(^[^ ]*) +(.*$)/,,\2,,\1,/' Input_file
说明:首先使用sed
的-E
选项启用ERE(扩展正则表达式)。然后在主程序中使用s
选项进行替换操作。在替换的第一部分中创建 2 个反向引用(能够通过使用正则表达式来捕获值并将它们保存在临时缓冲区中以供稍后在替换的第二部分中使用它时使用)。在替换的第二部分,用 2 个逗号替换整行,然后是第二个捕获组\2
,然后是 2 个逗号,然后是第一个捕获组 \1
,然后是 ,
。
【讨论】:
【参考方案3】:您可以在 sed
脚本中轻松添加空列。
sed 'y/ /,/;s/,/,,/;s/^/,,/;s/$/,/' input.csv >> file.csv
这将第一个逗号替换为两个,然后在前面添加两个,在末尾添加一个。
不过,您的预期输出看起来不像有效的 CSV。这也很脆弱,因为它对于任何包含空格或逗号的文件名都会失败。
【讨论】:
【参考方案4】:您可以使用awk
代替sed
cat input.csv | awk 'print ",," $1 "," $2 ","' >> file.csv
awk
可以逐行处理标准输入。它实现了一个打印函数,每个单词都作为一个参数处理(在你的例子中,$1
和$2
)。在上面的示例中,我添加了,,
和,
作为内联参数。
【讨论】:
那是useless use ofcat
. 同样的逻辑也可以在sed
中轻松实现。
@tripleee 我不知道如何使用sed
命令实现该逻辑。
我认为这是我最容易理解的解决方案。 @BeardOverflow以上是关于将命令的输出写入 csv 文件的特定列,unix的主要内容,如果未能解决你的问题,请参考以下文章