从文件中读取列,然后将列写入现有的 csv 文件

从文件中读取列,然后将列写入现有的 csv 文件

本质上,我有一个包含多列的 csv 文件,称为 cols.csv

1,a,100
2,b,200
3,c,300
4,e,400

我有一个新的 csv 文件,其中有一列,名为 col.csv

f
g
h
i

我想复制 col.csv 中的项目并将它们附加到 cols.csv 中每行的末尾,以便 cols.csv 现在包含这些项目

1,a,100,f
2,b,200,g
3,c,300,h
4,e,400,i

这可能吗?我尝试加入、粘贴,但没有任何效果

答案1

内容test1.txt

1,a,100
2,b,200
3,c,300
4,e,400

内容test2.txt

f
g
h
i

样本。

$ paste -d, test1.txt test2.txt 
1,a,100,f
2,b,200,g
3,c,300,h
4,e,400,i

解释

我们使用该-d标志将分隔符设置为 ,

答案2

使用-d粘贴标志将分隔符设置为逗号:

paste -d, cols.csv col.csv

答案3

假设我们正在处理可能包含带有嵌入换行符的引用字段的 CSV 输入,我们无法使用基于行的工具(例如paste组合两个文件)。这样做会生成格式不正确的输出。

以下示例使用两个文件,每个文件包含三个记录,其中第一个文件中的第二个字段在每个记录中包含嵌入的换行符。

file1

Field 1,Field 2
YYYYMMDD-XXXX,"10 Somestreet
NNNNNN Somecity"
YYYYMMDD-YYYY,"20 Otherstreet
MMMMMM Somecity"
YYYYMMDD-ZZZZ,"25 Bumble Rd
KKKKKK Village"

file2

Field 3
"1,a"
"1,b"
"2,c"

在这里使用paste显然不会做正确的事情:

$ paste -d , file1 file2
Field 1,Field 2,Field 3
YYYYMMDD-XXXX,"10 Somestreet,"1,a"
NNNNNN Somecity","1,b"
YYYYMMDD-YYYY,"20 Otherstreet,"2,c"
MMMMMM Somecity",
YYYYMMDD-ZZZZ,"25 Bumble Rd,
KKKKKK Village",

相反,我们使用名为 CSV 的工具磨坊主( mlr) 向两个文件中的每条记录添加记录号,该字段称为nr.通过使用-IMiller 选项“就地”将字段添加到文件中:

$ mlr --csv -I put '$nr=FNR' file1 file2

然后我们使用这些数字将文件连接在一起。

$ mlr --csv join -f file1 -j nr file2
nr,Field 1,Field 2,Field 3
1,YYYYMMDD-XXXX,"10 Somestreet
NNNNNN Somecity","1,a"
2,YYYYMMDD-YYYY,"20 Otherstreet
MMMMMM Somecity","1,b"
3,YYYYMMDD-ZZZZ,"25 Bumble Rd
KKKKKK Village","2,c"

通过操作,如果该字段不再有用,cut我们可以将其删除:nr

$ mlr --csv join -f file1 -j nr then cut -x -f nr file2
Field 1,Field 2,Field 3
YYYYMMDD-XXXX,"10 Somestreet
NNNNNN Somecity","1,a"
YYYYMMDD-YYYY,"20 Otherstreet
MMMMMM Somecity","1,b"
YYYYMMDD-ZZZZ,"25 Bumble Rd
KKKKKK Village","2,c"

相关内容