我有一个具有以下格式的 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
next
awk
print $0 (NF? OFS id : "")
- 打印/输出整个记录,$0
条件为:
如果记录中有任何字段(由NF
内置变量确保),即记录不为空 - 将;
(asOFS
) 和当前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