2013-05-10 48 views
1

我提供了一個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和切,但我不能得到它的工作。

回答

6

髒快捷:

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

0

一種可能性是:

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

這看起來兩個數字的空白的兩側,只保留了兩位數字。對於顯示的數據,它會正常工作。如果您可能需要處理11 234 567.89,則可以添加尾隨g

如果您可能有其他數列之間的空格,或不是第一個這樣的列,您可以在相關字段中使用awk中的gsub()類似的技術/正則表達式。

0

只是在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