使用Shell脚本在列级别复制相同的值

时间:2019-01-17 06:34:54

标签: shell csv duplicates

我有一个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列始终是第1个文件中的值,其余列需要与第2个文件的第1行重复。

2 个答案:

答案 0 :(得分:0)

您可以使用命令粘贴(将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循环才能添加相同数量的行,但是,我相信可能还有其他选择。

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

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 ","

答案 1 :(得分:0)

像这样的脚本可以完成工作:

awk -F\, 'NR==1 {a=$3"," $4;print } NR!=1 {print $0""a}' input.file

要拥有更多列,您可以通过这种方式将它们添加到awk

awk -F\, 'NR==1 {a=$3","$4","$5","$6","$7","$8","$9;print } NR!=1 {print $0""a}' input.file
相关问题