我有一个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