Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用bash从单个列中删除空格_Bash_Csv_Sed_Awk - Fatal编程技术网

使用bash从单个列中删除空格

使用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=","

我收到了一个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="," '{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=,
中使用引号。