CSV 创建一个新列并删除空格

CSV 创建一个新列并删除空格

我有一个包含多列的大型 csv 文件。我希望从第一列中删除空格,并将其创建为新列。

例子...

输入:

a b,xyz,d e f    
a b c,xyz,d e f    
a b c d,xyz,d e f   

输出:

ab,a b,xyz,d e f   
abc,a b c,xyz,d e f   
abcd,a b c d,xyz,d e f    

答案1

使用sed

sed 'h;s/,.*/,/;s/ //g;G;s/\n//' data.csv

解释:

h - stash current line to the hold space
s/,.*/,/ - remove everything after the first comma
s/ //g - remove spaces
G - append the line from the hold space back to the pattern space
s/\n// - remove extra newline, as left by G

答案2

bash与标准工具一起使用:

$ paste -d ',' <( cut -d ',' -f 1 file | tr -d ' ' ) file
ab,a b,xyz,d e f
abc,a b c,xyz,d e f
abcd,a b c d,xyz,d e f

paste将两个给定文件的输入组合在一起,并以逗号作为分隔符。

第一个文件是通过进程替换生成的,该进程替换提取文件的第一个逗号分隔列并删除其空格。

第二个文件只是原始的未修改文件。

答案3

bash假设有一个文件的解决方案test.txt

#!/bin/bash

while read -r line; do
   IFS=',' read -ra fields <<<"$line"
   (IFS=','; echo "${fields[0]//\ /},${fields[*]}")
done <"test.txt"

exit

这利用了IFS将 csv 的值读入数组并输出。将 的每一行读test.txt入一个字符串,然后通过逗号分隔将该行读入一个数组。打印删除了空格的该数组的第一个元素,然后打印整个数组。使用带引号的数组*将输出由 分隔的元素IFS,我们之前将其设置为逗号。语句IFSread和子 shell 中的内联声明将为脚本执行的其余部分()保留 的值。IFS

答案4

与伟大的磨坊主是:

mlr --csv --implicit-csv-header --headerless-csv-output \ put '$newField=gsub($1," +","")' \ then reorder -f newField input.csv

$1是第一个字段。比我应用正则表达式搜索和替换来获取新字段。

相关内容