2012-06-27 74 views
1

我有一个CSV文件,其中每个列包含不必要的空格(或制表符)后的实际值。我想创建一个新的CSV文件,使用bash删除所有空格。从bash中的CSV文件的列中删除空格

例如

在输入CSV文件

一行

abc def pqr    ;valueXYZ    ;value PQR    ;value4 
在输出csv文件

同一行应该是

abc def pqr;valueXYZ;value PQR;value4 

我试图使用AWK削减各列,但它没有工作。任何人都可以帮助我吗?

感谢提前:)

我编辑我的测试情况下,由于这里的值可以包含空格。

+0

对不起,在这个问题加起来, 此处的值可以包含空格也(对于离一个值1可以“等等等等等等”)。但我想维护这些空间,我只是想删除两个值之间的空格。 –

+1

然后你需要提供更准确的测试输入。 – Thor

回答

2
$ cat cvs_file | awk 'BEGIN{ FS=" *;"; OFS=";" } {$1=$1; print $0}' 
  1. 设置输入字段分隔符(FS)至零个或多个空格,随后分号正则表达式。
  2. 将输出字段分隔符(OFS)设置为简单分号。
  3. $1=$1有必要刷新$0
  4. 打印$0

$ cat cvs_file 
abc def pqr    ;valueXYZ    ;value PQR    ;value4 

$ cat cvs_file | awk 'BEGIN{ FS=" *;"; OFS=";" } {$1=$1; print $0}' 
abc def pqr;valueXYZ;value PQR;value4 
+0

非常感谢你为这一个@vergenzt!这照顾了所有的情况:) –

2

如果值本身都是免费的空间,将典型的解决方案(在我看来)是使用tr

$ tr -d '[:blank:]' <CSV_FILE> CSV_FILE_TRIMMED 
+0

哇!这工作!非常感谢你:) –

0

这将只是一个空格代替多个空格:

sed -r 's/\s+/ /g' 
0

如果你知道你的列数据将结束在什么,那么这是一个正确的方式做到这一点:

sed 's|\(.*[a-zA-Z0-9]\) *|\1|g'

的字符类是,你把你的任何数据将结束。

否则,如果你知道一个以上的空间是不会进来的领域,那么你可以使用什么user1464130给你。

如果这不能解决您的问题,那就回到我身边。