将命令的输出写入 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 of cat. 同样的逻辑也可以在sed 中轻松实现。 @tripleee 我不知道如何使用sed 命令实现该逻辑。 我认为这是我最容易理解的解决方案。 @BeardOverflow

以上是关于将命令的输出写入 csv 文件的特定列,unix的主要内容,如果未能解决你的问题,请参考以下文章

如何列出 CSV 文件中的各个列?

PowerShell - 从 csv 文件读取数据,比较特定列中的数据并将结果写入新文件

如何将火花数据输出到具有单独列的 csv 文件?

python 如何将数据写入某个csv文件的特定位置?

将python字典写入CSV但仅包含特定列

Pyspark:将df写入具有特定名称的文件,绘制df