我有一個CSV文件,其中每個列包含在實際值之前添加的不必要的額外空間。我想通過刪除所有空格來創建一個新的CSV文件。刪除bash/unix中CSV文件的所有列的空格
例如,在輸入CSV
一號線文件
123, ste hen, 456, out put
預計輸出CSV文件
123,ste hen,456,out put
我試着用awk來調整每個列,但沒有奏效。
我有一個CSV文件,其中每個列包含在實際值之前添加的不必要的額外空間。我想通過刪除所有空格來創建一個新的CSV文件。刪除bash/unix中CSV文件的所有列的空格
例如,在輸入CSV
一號線文件
123, ste hen, 456, out put
預計輸出CSV文件
123,ste hen,456,out put
我試着用awk來調整每個列,但沒有奏效。
echo " 123, ste hen, 456, out put" | awk '{sub(/^ +/,""); gsub(/, /,",")}1'
123,ste hen,456,out put
但它不能處理目前表格中提到的_extra space ** S ** _ OP。 –
這將做到這一點:'awk'{sub(/ + /,「」); gsub(/ *,* /,「,」)} 1'test.in'。首先'sub'刪除記錄中的所有前導空格,'gsub'處理逗號周圍的空格。記錄尾部空間需要另一個'gsub',它可以替代第一個'sub'這樣的東西:'gsub(/^* | * $ /,「」)'。 –
感謝您的諮詢! –
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}
。這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
你可以嘗試:
cat ~/path/file.csv | tr -d "\ " sed "s/, /,/g" ~/path/file.csv
的另一種方法與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
有比這更短的方法,不錯的嘗試。說到awk,總體趨勢是欣賞優雅的慣用方法。 –
@mona_sax:讚賞! – Inian
$ 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
如果你使用'-F'*,*'',那麼你不需要循環,只需要1個'gsub(/^+ | + $ /,「」)'和一個字段賦值'$ 1 = $ 1'。 –
刪除前導空白字符使用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:]]
,如果你能有選項卡以及空白字符。
謝謝埃德的幫助!我已經學會了如何使用sed和awk。 – stephenjacob
所以你可以展示你的嘗試? – fedorqui