使用bash从单个列中删除空格

问题描述:

我提供了一个CSV文件,它在单个列中使用空格来表示千位分隔符(例如,11000而不是11,000或11000)。其他列中有有用的空格,所以我只需要修复这一列。使用bash从单个列中删除空格

我的数据:

Date,Source,Amount 
1/1/2013,Ben's Chili Bowl,11 000.90 

我需要得到:

Date,Source,Amount 
1/1/2013,Ben's Chili Bowl,11000.90 

我一直在努力的awk,sed和切,但我不能得到它的工作。

脏快捷:

awk -F, -v OFS="," '{gsub(/ /,"",$NF)}1' 

例如:

kent$ echo "Date,Source,Amount 
1/1/2013,Ben's Chili Bowl,11 000.90"|awk -F, -v OFS="," '{gsub(/ /,"",$NF)}1' 
Date,Source,Amount 
1/1/2013,Ben's Chili Bowl,11000.90 
+0

只是为进一步的信息,'$ NF'可以用'$ N'取代作出改变的任何'nth'列具体 – abasu 2013-05-10 17:14:12

+0

真棒,工作完美,谢谢你肯特!我会四处搜寻,看看它是如何工作的,但如果你不介意给我解释,我会很感激。 – user2057932 2013-05-10 17:22:11

+0

选项告诉'awk'使用逗号作为输入('-F,')和输出('-v OFS =,')的字段分隔符。 'gsub(/ /,“”,somestring)'在给定的字符串中完全替换空格(这是'/'...'/'之间的空格)('“”')。 NF是(逗号分隔的,感谢'-F,')字段的数量,'$'n是第n个字段,所以'$ NF'意味着该行的最后一个字段。最后的'1'告诉awk在之后执行它的默认值,这是将修改的字段打印出来,并由OFS分隔。所以:删除每行的最后逗号分隔字段中的所有空格。 – 2013-05-10 17:26:10

一种可能性是:

sed 's/\([0-9]\) \([0-9]\)/\1\2/' 

这看起来两个数字的空白的两侧,只保留了两位数字。对于显示的数据,它会正常工作。如果您可能需要处理11 234 567.89,则可以添加尾随g

如果您可能有其他数列之间的空格,或不是第一个这样的列,您可以在相关字段中使用awk中的gsub()类似的技术/正则表达式。

只是在bash

$ echo "Date,Source,Amount 
1/1/2013,Ben's Chili Bowl,11 000.90" | 
while IFS=, read -r date source amount; do 
    echo "$date,$source,${amount// /}" 
done 
Date,Source,Amount 
1/1/2013,Ben's Chili Bowl,11000.90