从一个CSV复制n行,并将它们粘贴到另一个CSV中n次



我想弄清楚这个问题时遇到了一点问题。

我有两个CSV文件,一个没有标题,另一个有标题。

file1.csv (no headers):
apples
bananas
file2.csv (with headers):
HEADER1,HEADER2
item1,item3
item1,item3
item1,item3
item2,item3
item2,item3
item2,item3

我想创建一个新文件:;file3.csv";其中";苹果";以及";香蕉";被列出的次数与";项目1";以及";项目2";分别地

生成的file3.csv应该如下所示:

file3.csv
HEADER1,HEADER2,HEADER3
item1,item3,apples
item1,item3,apples
item1,item3,apples
item2,item3,bananas
item2,item3,bananas
item2,item3,bananas

为了添加新的标题,我使用echo "$(head -n 1 file2.csv),HEADER3 >file3.csv

为了复制和粘贴我尝试过的行:awk -F, -v OFS=, 'NR==FNR {a[$1]=$1; next} {print $0,a[$1]}' file1.csv file2.csv,但它没有按我的意愿工作。

如果一个锥子专家能帮我一点忙,我将永远心存感激。

谢谢!

golfeed版本

$ awk -F, -v OFS=, 'NR==FNR{a[NR+1]=$1;a[1]="HEADER3";next} $3=a[b[$1]=c+=!b[$1]]' file{1,2}.csv
HEADER1,HEADER2,HEADER3
item1,item3,apples
item1,item3,apples
item1,item3,apples
item2,item3,bananas
item2,item3,bananas
item2,item3,bananas
$ cat tst.awk
BEGIN { FS=OFS="," }
NR == FNR {
idx2fruit[FNR] = $0
next
}
!seen[$1]++ {
item2idx[$1] = cnt++
}
{
idx = item2idx[$1]
fruit = (FNR > 1 ? idx2fruit[idx] : "HEADER3")
print $0, fruit
}

$ awk -f tst.awk file1.csv file2.csv
HEADER1,HEADER2,HEADER3
item1,item3,apples
item1,item3,apples
item1,item3,apples
item2,item3,bananas
item2,item3,bananas
item2,item3,bananas

这可能对你有用(GNU sed(:

sed -E '1{x;s/^/cat file1/e;s/$/n/;x;s/$/,HEADER3/;b}
2H;:a;G;/^([^,]*,).*n1/{s/n([^n]*).*/,1/;b}
x;s/^[^n]*n(.*)n.*/1/;x;s/n.*//;H;ba' file2

概述:

file1行保留在保留空间中,并将它们附加到来自file2的行。当file2中的键发生变化时,从保持空间中的file1弹出一行并重复。

N。B.保留空间兼作来自file1的行的存储库,还存储来自file2的前一行密钥。

file1中的记录填充保留空间,并附加第三个标头。

将当前行与前一行进行比较,如果键相同,则将第一行附加到file1的保持空间中

否则,删除file1保持空间中的第一行,并用当前行键替换该键,从当前行的保持空间中删除附加行,然后跳回并执行之前关于键何时匹配的指令。

相关内容

最新更新