CSV文件合并、列/行增删及相关命令问题咨询
CSV操作常见问题解答
1. 如何合并两个CSV文件(将单表头文件转为新列)
你的问题出在product2.csv只有一行表头,而paste/cat/csvjoin的逻辑不匹配需求:
cat是直接拼接文件内容,自然把product2.csv的表头当成新行;paste按行对应合并,当两个文件行数不一致时,短文件的行只会匹配一次,无法实现给所有数据行补空值;csvjoin是按关联键合并表,你没指定键且product2无数据,所以逻辑不对。
正确做法是把product2.csv的表头作为新列名追加到product1.csv的表头后,再给每一行数据追加空值:
方法1:用sed+head/tail
# 提取product2的表头 new_col=$(head -n1 product2.csv) # 修改product1的表头并写入结果文件 head -n1 product1.csv | sed "s/$/,${new_col}/" > result.csv # 给product1的所有数据行追加空值 tail -n+2 product1.csv | sed "s/$/,/" >> result.csv
方法2:用awk更简洁
BEGIN {FS=OFS=","} # 读取product2的表头,追加到product1的表头后 NR==1 {getline new_col < "product2.csv"; print $0, new_col; next} # 给每一行数据追加空值 {print $0, ""}
保存为add_col.awk,运行命令:
awk -f add_col.awk product1.csv > result.csv
关于CSV的行识别:CSV默认用**换行符(\n)**区分不同行,所有按行拼接的命令(比如cat)都会把第二个文件的内容当成新行插入,这是文件拼接的默认逻辑。
2. 无CSV文件时,能否用awk或sed追加列
可以,不管是从标准输入生成内容,还是凭空构建CSV,都能实现:
给现有文本追加列(比如从标准输入读取)
- awk实现:
echo -e "a,b,c\n1,2,3\n4,5,6" | awk 'BEGIN{FS=OFS=","} {print $0, "new_column"}'
- sed实现:
echo -e "a,b,c\n1,2,3\n4,5,6" | sed 's/$/,new_column/'
凭空生成带新列的CSV
用awk直接输出:
awk 'BEGIN{ FS=OFS="," print "col1,col2,new_col" print "1,2," print "3,4," }' > new.csv
3. 如何删除第4列
方法1:用awk(通用,适合任意列数)
awk 'BEGIN{FS=OFS=","} { for(i=1; i<=NF; i++){ if(i != 4){ printf "%s%s", $i, (i==NF ? "\n" : OFS) } } }' product1.csv > result.csv
如果列数固定且大于4,也可以直接指定输出列:
awk 'BEGIN{FS=OFS=","} {print $1,$2,$3,$5}' product1.csv > result.csv
方法2:用csvcut(更安全,适合带引号的复杂CSV)
如果安装了csvkit工具,用csvcut更稳妥:
csvcut -C 4 product1.csv > result.csv
4. 如何删除第4行
方法1:用sed
sed '4d' product1.csv > result.csv
方法2:用awk
awk 'NR != 4' product1.csv > result.csv
内容的提问来源于stack exchange,提问作者dima1002
相关产品推荐
相关产品推荐

