【问题标题】:Moving column down in CSV with bash使用 bash 在 CSV 中向下移动列
【发布时间】:2017-05-26 17:02:25
【问题描述】:

我在分号分隔的 CSV 文件中有以下数据集:

"11-01-2017";"17:13";"X";"";...
"11-01-2017";"";"X";"17:32";...
"11-01-2017";"20:13";"Y";"";...
"11-01-2017";"";"Y";"20:25";...

我如何在 bash 中将第二列中的每个条目向下移动 1 位,从而导致:

"11-01-2017";"";"X";"";...
"11-01-2017";"17:13";"X";"17:32";...
"11-01-2017";"";"Y";"";...
"11-01-2017";"20:13";"Y";"20:25";...

在这种情况下,双引号必须保留在条目周围。

【问题讨论】:

  • 你是否总是在每条偶数记录的第二列有""?

标签: bash sorting csv


【解决方案1】:

您可以将 awk 与这样的脚本一起使用:

script.awk

BEGIN { FS = ";"
        OFS= FS
        prev2 ="\"\""
    }
    { tmp = $2; $2 = prev2; prev2 = tmp }

    1

像这样运行它:awk -f script.awk yourfile。

  • 第一个块将输入和输出分隔符设置为;
  • 第二个块将第二列设置为上一行的值并存储当前行的值
  • 最后一行的1 是打印当前值的简写

【讨论】:

  • 不错的答案。但是,您的脚本似乎删除了要移动的第一个值的双引号。这是我的输出:"11-01-2017";;"X";"";... "11-01-2017";"17:13";"X";"17:32";... "11-01-2017";"";"Y";"";...
  • @JamilSaid 感谢您的提示。我更新了答案。
  • 这个答案不是假设输出在第一条记录中需要""吗?
  • @anubhava 是的。最后一行中的原始值被删除。
猜你喜欢
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多