首页 > 解决方案 > 使用 shell 脚本在列级别复制相同的值

问题描述

我有一个 CSV 文件,如下所示。我需要使用 unix shell 命令实现在列级别复制相同的值。数据如下图

col1, col2, col3, col4, col5, col6, col7, col8... 
aaaa,12-jan-2018,ddd,10,5,6,sample,xxx,yyyy
bbbb,12-jan-2018,
bbbb,14-jan-2018,
cccc,15-jan-2018,

我需要将 CSV 文件转换为如下所示

col1, col2, col3, col4, col5, col6, col7, col8... 
aaaa,12-jan-2018,ddd,10,5,6,sample,xxx,yyyy
bbbb,12-jan-2018,ddd,10,5,6,sample,xxx,yyyy
bbbb,14-jan-2018,ddd,10,5,6,sample,xxx,yyyy
cccc,15-jan-2018,ddd,10,5,6,sample,xxx,yyyy

但是,前 3 列将始终具有来自第一个文件的值,其余列需要与第二个文件的第一行重复。

标签: shellcsvduplicates

解决方案


您可以使用命令粘贴(替换INPUT.csv为您的文件名):

paste <(cat INPUT.csv | cut -f 1,2 -d "," ) <(for l in $(cat INPUT.csv); do echo "ddd,10,5,6,sample,xxx,yyyy"; done) -d ","

for循环需要添加相同数量的行,但是,我相信可能还有其他选择。

此外,您可以用管道替换 echocat | cut | head以获取您感兴趣的第一行中的元素,例如:

paste <(cat INPUT.csv | cut -f 1,2 -d "," ) <(for l in $(cat INPUT.csv); do cat INPUT.csv | cut -f 3-9 -d "," | head -n 1; done) -d ","

或者只是一次合并两个文件(相应地替换INPUT_1.CSVINPUT_2.CSV

paste <(cat INPUT_1.csv | cut -f 1,2 -d "," ) <(for l in $(cat INPUT_1.csv); do cat INPUT_2.csv; done) -d ","


推荐阅读