将 .csv 文件与不同行数合并

将 .csv 文件与不同行数合并

在这里我已经问过类似的问题。

现在我有 3 个 .csv 文件,但其中一个只有 1 行。

文件1.csv

dog
cats
mouse

文件2.csv

001a
002a
003c

文件3.csv

WORD

输出应该是

dog,001a,WORD
cats,002a,WORD
mouse,003c,WORD

一种解决方案(从我之前的问题) 是:

paste -d, file1.csv file2.csv | awk -F, '{print $1 "," $2 ",WORD"}'

但“WORD”在这里只是写入,而不是从 file3.csv 读取。

有没有办法告诉paste用 file3.csv 填充每一行?或者也许将 file3.csv 保存为变量并将其赋予awk

答案1

这是另一个简单的方法:

$ paste  -d, file1 file2 file3 | awk 'BEGIN{FS=OFS=","} {if(NR==1){w=$3} else {$3=w}}1'
dog,001a,WORD
cats,002a,WORD
mouse,003c,WORD

答案2

$ paste -d, file1.csv file2.csv |
    awk -v OFS=',' 'NR==FNR{w=$0; next} {print $0, w}' file3.csv -
dog,001a,WORD
cats,002a,WORD
mouse,003c,WORD

答案3

使用fill-down子命令磨坊主( mlr) 我们可以用前一个记录的相应字段中的值填充所有空字段,无论文件有多长。

以下命令假设每个文件中的数据是无头 CSV,它将对每条记录中的所有三个字段执行填充操作:

paste -d, file1 file2 file3 | mlr -N --csv fill-down -f 1,2,3

运行示例(请注意,我使用的是较短的第二个文件):

$ cat file1
dog
cats
mouse
$ cat file2
001a
002a
$ cat file3
WORD
$ paste -d, file1 file2 file3
dog,001a,WORD
cats,002a,
mouse,,
$ paste -d, file1 file2 file3 | mlr -N --csv fill-down -f 1,2,3
dog,001a,WORD
cats,002a,WORD
mouse,002a,WORD

一种变体,用于paste为 Miller 创建 TSV 数据集(只需不设置非默认分隔符),然后利用该--t2c选项将 TSV 转换为 CSV(两个选项--itsv和 的组合的快捷方式--ocsv):

paste file1 file2 file3 | mlr -N --t2c fill-down -f 1,2,3

相关内容