本质上,我有一个包含多列的 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
.通过使用-I
Miller 选项“就地”将字段添加到文件中:
$ 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"