使用bash从单个列中删除空格
我收到了一个CSV文件,它在一列中使用空格表示千位分隔符(例如11000而不是11000或11000)。其他列中有有用的空格,因此我只需要修复这一列 我的数据:使用bash从单个列中删除空格,bash,csv,sed,awk,Bash,Csv,Sed,Awk,我收到了一个CSV文件,它在一列中使用空格表示千位分隔符(例如11000而不是11000或11000)。其他列中有有用的空格,因此我只需要修复这一列 我的数据: 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和cut,但我无法让它工作。又脏又快: awk -F, -v OFS=","
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和cut,但我无法让它工作。又脏又快:
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
又脏又快:
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
一种可能是:
sed 's/\([0-9]\) \([0-9]\)/\1\2/'
这将在空白的两侧查找两个数字,并仅保留两个数字。对于所显示的数据,它可以正常工作。如果您可能需要处理11234 567.89
,则可以添加尾随g
如果可能有其他列的数字之间有空格,或者不是第一列,则可以在相关字段上使用
awk
中的类似技巧/regex和gsub()
一种可能是:
sed 's/\([0-9]\) \([0-9]\)/\1\2/'
这将在空白的两侧查找两个数字,并仅保留两个数字。对于所显示的数据,它可以正常工作。如果您可能需要处理11234 567.89
,则可以添加尾随g
如果可能有其他列的数字之间有空格,或者不是第一列,则可以在相关字段上使用awk
中的类似技巧/regex和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
就用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
为了进一步了解,
$NF
可以替换为$n
,以便在任何n
列中进行更改。非常棒,工作非常出色,谢谢Kent!我将四处搜索,看看这实际上是如何工作的,但如果您不介意向我解释的话,我将不胜感激。这些选项告诉awk
使用逗号作为输入(-F,
)和输出(-vofs=,
)的字段分隔符gsub(//,“”,somestring)
将空格(即/
../
之间的空格)替换为给定字符串中完全没有(“”
)的空格。NF是(逗号分隔的,由于-F,
)字段的数量,$
n是第n个字段,因此$NF
表示行中的最后一个字段。最后的1
告诉awk以后做它的默认工作,即将修改后的字段打印出来,以OFS分隔。因此:删除每行最后一个逗号分隔字段中的所有空格。此外,由于这看起来像golfish,我要注意的是,实际上您不需要在-v of s=,
中使用引号。仅为进一步说明,$NF
可以替换为$n
,以使任何n
列中的更改都非常有效,谢谢你,肯特!我将四处搜索,看看这实际上是如何工作的,但如果您不介意向我解释的话,我将不胜感激。这些选项告诉awk
使用逗号作为输入(-F,
)和输出(-vofs=,
)的字段分隔符gsub(//,“”,somestring)
将空格(即/
../
之间的空格)替换为给定字符串中完全没有(“”
)的空格。NF是(逗号分隔的,由于-F,
)字段的数量,$
n是第n个字段,因此$NF
表示行中的最后一个字段。最后的1
告诉awk以后做它的默认工作,即将修改后的字段打印出来,以OFS分隔。因此:删除每行最后一个逗号分隔的字段中的所有空格。另外,由于这看起来像golfish,我要注意的是,实际上您不需要在-v of s=,
中使用引号。