我有一个包含多列的大型 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
,我们之前将其设置为逗号。语句IFS
中read
和子 shell 中的内联声明将为脚本执行的其余部分()
保留 的值。IFS
答案4
与伟大的磨坊主是:
mlr --csv --implicit-csv-header --headerless-csv-output \ put '$newField=gsub($1," +","")' \ then reorder -f newField input.csv
$1
是第一个字段。比我应用正则表达式搜索和替换来获取新字段。