在bash / unix中删除CSV文件的所有列的空格

时间:2016-07-27 09:54:35

标签: bash shell unix awk sed

我有一个CSV文件,其中每列都包含在实际值之前添加的不必要的额外空格。我想删除所有空格来创建一个新的CSV文件。

例如

输入CSV文件中的一行

 123, ste hen, 456, out put

预期输出CSV文件

123,ste hen,456,out put

我尝试使用awk修剪每一列,但它没有工作。

8 个答案:

答案 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}
  • 有关详细信息,请参阅[ awk ]手册。

答案 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)

你可以尝试:

  • 你的档案:〜/ path / file.csv

cat ~/path/file.csv | tr -d "\ " sed "s/, /,/g" ~/path/file.csv