CSV - 将某些列转换为具有重复数据的行

CSV - 将某些列转换为具有重复数据的行

我正在与一家反应迟钝的供应商合作,Excel 完全无法搜索该供应商的 CSV 文件库存。我的团队不了解或不使用 Unix,但我知道一两个简单的 IF 循环和awksed就能解决我的问题。

原始文件是这样的:

Col1 Col2    ... Col8 ..... Col30 Col31 .. Col30+N
---------------------
UPC MasterSKU ...  UnitCost ..... AltSKU1 AltSKU2 .. AltSKU_N

有些 MasterSKU 只有几个 AltSKU,有些则多达 318 个。这个最大数量可以每月更改!

例子:

UPC MasterSKU  Cost AltSKU1 AltSKU2 .... AltSKU_N
------------------------------------------------------
10000001  ABC  $5.00  ABC01 ABC001 ABC1
10000002  BCD  $2.34  BCD01 BCD.go BD.c.2 ...200 AltSKUs later... BDDCD7

由于我的团队需要 Excel 并且搜索算法受到限制,因此我需要在单列中列出所有 AltSKU,并在它们旁边列出成本。

这就是我希望得到的输出:

UPC MasterSKU  Cost AltSKU
--------------------------
10000001  ABC  $5.00  ABC01
10000001  ABC  $5.00  ABC001
10000001  ABC  $5.00  ABC1
10000002  BCD  $2.34  BCD01
10000002  BCD  $2.34  BCD.go
10000002  BCD  $2.34  BCD01

 ... repeat for 200 AltSKUs

10000002  BCD  $2.34  BDDCD7

注意:ABC MasterSKU 发生了什么。由于只有 3 个 AltSKU,因此只有 3 条线路。前 3 个非空白 AltSKU 之后不存在 315 个空白 AltSKU

答案1

在 awk 中执行此操作的一种方法如下:

代码:

$ awk '{ for (i=4; i <= NF; i++) print $1, $2, $3, $i }' file1 

文件1:

10000001 ABC $5.00 ABC01 ABC001 ABC1
10000002 BCD $2.34 BCD01 BCD.go BD.c.2 BDDCD7

结果:

10000001 ABC $5.00 ABC01
10000001 ABC $5.00 ABC001
10000001 ABC $5.00 ABC1
10000002 BCD $2.34 BCD01
10000002 BCD $2.34 BCD.go
10000002 BCD $2.34 BD.c.2
10000002 BCD $2.34 BDDCD7

相关内容