在 CSV 文件中附加上一个匹配项的列

在 CSV 文件中附加上一个匹配项的列

我有一个具有以下格式的 CSV 文件(;是分隔符):

KEY;..;..;..;..;id1;..;..
SUBKEY;..;..
SUBKEY;..;..
SUBKEY;..;..

KEY;..;..;..;..;id2;..;..
SUBKEY;..;..
SUBKEY;..;..
SUBKEY;..;..

我需要id从以 开头的每一行中取出(第 6 列),KEY然后将其附加到以 开头的以下行中SUBKEY。所以结果应该是这样的:

SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id1

SUBKEY;..;..;id2
SUBKEY;..;..;id2
SUBKEY;..;..;id2

知道如何在 bash 脚本中完成此操作吗?

答案1

Awk解决方案:

awk 'BEGIN{ FS = OFS = ";" }
     $1 == "KEY"{ id = $6; next }
     { print $0 (NF? OFS id : "") }' file.csv
  • FS = OFS = ";"- 视为;字段分隔符 ( FS) 和输出字段分隔符 ( OFS)
  • $1 == "KEY"{ id = $6; next }- 如果第一个字段$1等于带有第六个字段的"KEY"字符串集变量。 将强制跳转到下一条记录(跳过当前记录)id$6
    nextawk
  • print $0 (NF? OFS id : "")- 打印/输出整个记录,$0条件为:
    如果记录中有任何字段(由NF内置变量确保),即记录不为空 - 将;(as OFS) 和当前id值附加到记录末尾

输出:

SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id1

SUBKEY;..;..;id2
SUBKEY;..;..;id2
SUBKEY;..;..;id2

答案2

塞德解决方案:

sed -E '/^KEY/{s/([^;]*;){5}([^;]*).*/\2/;h;d};/;/{G;s/\n/;/}' file.csv
  • /^KEY/{s/([^;];){5}([^;]).*/\2/;h;d}

如果该行以 KEY 开头,则保留保留空间中的第 6 个字段并删除该行

  • /;/{G;s/\n/;/}

如果该行包含字段,则获取末尾的保留空间并将 \n 替换为 ;

答案3

我设法通过执行此操作来修复它 sed -r 's|^(\S+)(\s+\S+)$|s/^\1.*/\&\2/p|'文件2 | sed -nf - 文件1

现在我面临一个问题,我需要在 CSV 文件上附加一列,其中包含服务器所在的 ESX 的名称 根据另一个文件的条件搜索将字段附加到 csv

相关内容