我有一个CSV文件,其中每列都包含在实际值之前添加的不必要的额外空格。我想删除所有空格来创建一个新的CSV文件。
例如
输入CSV文件中的一行
123, ste hen, 456, out put
预期输出CSV文件
123,ste hen,456,out put
我尝试使用awk修剪每一列,但它没有工作。
答案 0 :(得分:8)
这个sed应该有效:
sed -i.bak -E 's/(^|,)[[:blank:]]+/\1/g; s/[[:blank:]]+(,|$)/\1/g' file.csv
这将删除逗号周围的前导spa,尾随空格和空格。
更新:这是一个执行相同操作的awk命令:
awk -F '[[:blank:]]*,[[:blank:]]*' -v OFS=, '{
gsub(/^[[:blank:]]+|[[:blank:]]+$/, ""); $1=$1} 1' file
答案 1 :(得分:4)
awk
是你的朋友。
<强>输入强>
$ cat 38609590.txt
Ted Winter, Evelyn Salt, Peabody
Ulrich, Ethan Hunt, Wallace
James Bond, Q, M
(blank line)
<强>脚本强>
$ awk '/^$/{next}{sub(/^[[:blank:]]*/,"");gsub(/[[:blank:]]*,[[:blank:]]*/,",")}1' 38609590.txt
<强>输出强>
Ted Winter,Evelyn Salt,Peabody
Ulrich,Ethan Hunt,Wallace
James Bond,Q,M
注意强>
/^$/{next}
。答案 2 :(得分:3)
使用sed删除前导空白字符:
$ sed -E 's/(^|,) +/\1/g' file
123,ste hen,456,out put
使用GNU awk:
$ awk '{$0=gensub(/(^|,) +/,"\\1","g")}1' file
123,ste hen,456,out put
其他问题:
$ awk '{sub(/^ +/,""); gsub(/, +/,",")}1' file
123,ste hen,456,out put
使用sed:
删除值前后的空白字符$ sed -E 's/ *(^|,|$) */\1/g' file
123,ste hen,456,out put
使用GNU awk:
$ awk '{$0=gensub(/ *(^|,|$) */,"\\1","g")}1' file
123,ste hen,456,out put
其他问题:
$ awk '{gsub(/^ +| +$/,""); gsub(/ *, */,",")}1' file
123,ste hen,456,out put
如果您有标签和空白字符,请将(单个空白字符)更改为
[[:blank:]]
。
答案 3 :(得分:2)
echo " 123, ste hen, 456, out put" | awk '{sub(/^ +/,""); gsub(/, /,",")}1'
123,ste hen,456,out put
答案 4 :(得分:1)
使用awk
删除多个前导空格的另一种方法如下: -
$ awk 'BEGIN{FS=OFS=","} {s = ""; for (i = 1; i <= NF; i++) gsub(/^[ \t]+/,"",$i);} 1' <<< "123, ste hen, 456, out put"
123,ste hen,456,out put
FS=OFS=","
将输入和输出字段分隔符设置为,
s = ""; for (i = 1; i <= NF; i++)
循环遍历每个列条目(即$1
,$2
... NF
),gsub(/^[ \t]+/,"",$i)
只修剪领先的白色空间而不是其他任何地方(一个或多个空格,请注意+
)来自每一列。如果您想对整个文件执行此操作,建议使用下面的简单脚本
#!/bin/bash
# Output written to the file 'output.csv' in the same path
while IFS= read -r line || [[ -n "$line" ]]; do # Not setting IFS here, all done in 'awk', || condition for handling empty lines
awk 'BEGIN{FS=OFS=","} {s = ""; for (i = 1; i <= NF; i++) gsub(/^[ \t]+/,"",$i);} 1' <<< "$line" >> output.csv
done <input.csv
答案 5 :(得分:1)
$ cat > test.in
123, ste hen, 456, out put
$ awk -F',' -v OFS=',' '{for (i=1;i<=NF;i++) gsub(/^ +| +$/,"",$i); print $0}' test.in
123,ste hen,456,out put
或大声写出:
BEGIN {
FS="," # set the input field separator
OFS="," # and the output field separator
}
{
for (i=1;i<=NF;i++) # loop thru every field on record
gsub(/^ +| +$/,"",$i) # remove leading and trailing spaces
print $0 # print out the trimmed record
}
使用以下命令运行:
$ awk -f test.awk test.in
答案 6 :(得分:1)
--depth
答案 7 :(得分:-2)
你可以尝试:
cat ~/path/file.csv | tr -d "\ "
sed "s/, /,/g" ~/path/file.csv