【问题标题】:Writing the output of a command to specific columns of a csv file, unix将命令的输出写入 csv 文件的特定列,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 脚本中也是如此。

标签: bash csv unix sed git-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
        猜你喜欢
        • 2021-02-26
        • 2023-03-11
        • 2012-02-18
        • 1970-01-01
        • 2016-05-01
        • 1970-01-01
        • 2014-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多