现在我有 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