linux - 将特定列添加到 CSV 文件的末尾

标签 linux bash

可以用 bash 做以下过程吗?

"Id";"Vzor";"Name";"Number";"Number2";"Ship"
"00041534";"MGKHTYE";"2014 TREK TYAX EXPERT, GREY/YELLOW";"100";"100,30";"A"
"00041535";"MGKHTYE";"2014 TREK TYAX EXPERT 29 , BLACK/RED";"100";"453,30";"A"
"00041531";"MGKHTYSP";"2014 OPS TYAX SPORT, WHITE/GREY";"100,90";"306,60";"A"
"00046024";"MGKFAR";"2015 OPS ARGUS, DARK TEAL";"899,90";"100,90";"A"
"00046088";"MGKHFB";"2015 TREK FIREBALL 24  , BLACK";"100,90";"239,90";"A"
"00046026";"MGKHFB";"2015 OPS FIREBALL 26 , BLUE";"100,90";"359,90";"A"

将一列添加到名为“Category”的第一行,并将(我不能做的)添加到各个行,从第 3 列添加该列的前两个单词(这将是类别名称):

"Id";"Vzor";"Name";"Number";"Number2";"Ship";"Category"
"00041534";"MGKHTYE";"2014 TREK TYAX EXPERT, GREY/YELLOW";"100";"100,30";"A";"2014 TREK"
"00041535";"MGKHTYE";"2014 TREK TYAX EXPERT 29 , BLACK/RED";"100";"453,30";"A";"2014 TREK"
"00041531";"MGKHTYSP";"2014 OPS TYAX SPORT, WHITE/GREY";"100,90";"306,60";"A";"2014 OPS"
"00046024";"MGKFAR";"2015 OPS ARGUS, DARK TEAL";"899,90";"100,90";"A";"2015 OPS"
"00046088";"MGKHFB";"2015 TREK FIREBALL 24  , BLACK";"100,90";"239,90";"A";"2015 TREK"
"00046026";"MGKHFB";"2015 OPS FIREBALL 26 , BLUE";"100,90";"359,90";"A";"2015 OPS"

冲击力!

最佳答案

您可以使用这个 awk 命令:

awk 'BEGIN{FS=OFS=";"}
   NR==1{print $0,"\"Category\"";next} {
   split($3, a, " ");
   printf "%s%s%s %s\"\n", $0, OFS, a[1], a[2]
}' file

"Id";"Vzor";"Name";"Number";"Number2";"Ship";"Category"
"00041534";"MGKHTYE";2014 TREK TYAX EXPERT, GREY/YELLOW;"100";"100,30";"A";"2014 TREK"
"00041535";"MGKHTYE";2014 TREK TYAX EXPERT 29 , BLACK/RED;"100";"453,30";"A";"2014 TREK"
"00041531";"MGKHTYSP";2014 OPS TYAX SPORT, WHITE/GREY;"100,90";"306,60";"A";"2014 OPS"
"00046024";"MGKFAR";2015 OPS ARGUS, DARK TEAL;"899,90";"100,90";"A";"2015 OPS"
"00046088";"MGKHFB";2015 TREK FIREBALL 24  , BLACK;"100,90";"239,90";"A";"2015 TREK"
"00046026";"MGKHFB";2015 OPS FIREBALL 26 , BLUE;"100,90";"359,90";"A";"2015 OPS"

解释:

  • BEGIN{FS=OFS=";"} 将输入和输出字段分隔符设置为 ;
  • NR==1 仅针对记录 #1 执行此 block
  • {print $0,"\"Category\"";next} 打印记录和文字文本 "Category"
  • split($3, a, "") 用空格分割字段 #3 并用单个单词填充数组 a
  • printf 通过从数组 a
  • 中取出 2 个第一个单词来打印格式化输出

关于linux - 将特定列添加到 CSV 文件的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27716323/

相关文章:

visual-studio - 从 bash 脚本调用 vcvars

BASH 发现 ctime 没有按预期工作

linux - 如何使用sed将目录下所有文件的windows路径更改为linux路径

php - 如何在 PHP 脚本中确定 Ajax 请求被取消

json - 使用 JQ Issue 解析复杂的 JSON 文件

linux - 反向函数通过 shell 读取应用 csv 中的特定列

Bash 集减法

linux - 检测是否应用了补丁

linux - 从 Monodevelop 7.1 创建 Linux 包

regex - 用于处理目录的 Bash 脚本 (REGEX)