2016-07-27 64 views
1

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

例如,在输入CSV

一号线文件

123, ste hen, 456, out put 

预计输出CSV文件

123,ste hen,456,out put 

我试着用awk来调整每个列,但没有奏效。

+3

所以你可以展示你的尝试? – fedorqui

回答

2
echo " 123, ste hen, 456, out put" | awk '{sub(/^ +/,""); gsub(/, /,",")}1' 
123,ste hen,456,out put 
+1

但它不能处理目前表格中提到的_extra space ** S ** _ OP。 –

+0

这将做到这一点:'awk'{sub(/ + /,“”); gsub(/ *,* /,“,”)} 1'test.in'。首先'sub'删除记录中的所有前导空格,'gsub'处理逗号周围的空格。记录尾部空间需要另一个'gsub',它可以替代第一个'sub'这样的东西:'gsub(/^* | * $ /,“”)'。 –

+0

感谢您的咨询! –

3

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 ]手册。
7

这sed的应该工作:

sed -i.bak -E 's/(^|,)[[:blank:]]+/\1/g; s/[[:blank:]]+(,|$)/\1/g' file.csv 

这将消除导致spaes,尾随逗号周围的空间和空间。

更新:这里是一个awk命令做相同的:

awk -F '[[:blank:]]*,[[:blank:]]*' -v OFS=, '{ 
    gsub(/^[[:blank:]]+|[[:blank:]]+$/, ""); $1=$1} 1' file 
+0

[Working Demo](http://ideone.com/qKUe9f) – anubhava

+1

'[[:blank:]]'字符类很方便,因为它包含标签 – sjsam

+1

是的,它匹配空格或制表符,但不匹配换行符。 – anubhava

-2

你可以尝试:

  • 文件:〜/路径/ FILE.CSV

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

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 
+1

有比这更短的方法,不错的尝试。说到awk,总体趋势是欣赏优雅的惯用方法。 –

+0

@mona_sax:赞赏! – Inian

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 
+1

如果你使用'-F'*,*'',那么你不需要循环,只需要1个'gsub(/^+ | + $ /,“”)'和一个字段赋值'$ 1 = $ 1'。 –

2

删除前导空白字符使用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 

与其他awks:

$ 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 

与其他awks:

$ awk '{gsub(/^ +| +$/,""); gsub(/ *, */,",")}1' file 
123,ste hen,456,out put 

变化(一个空格字符)到[[:blank:]],如果你能有选项卡以及空白字符。

+2

谢谢埃德的帮助!我已经学会了如何使用sed和awk。 – stephenjacob

相关问题