2016-07-27 63 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

相關問題