使用 sed 删除特定列的小数
Delete decimals of a specific columns with sed
我正在处理一个 csv 文件,我想用特定列的小数截断数字。
其中三行是:
123;rr;2;RRyO, chess mobil;pio;25.766;1;0;24353;21.876;;S
1243;rho;9;RpO, chess yext cat;downpio;67.98;1;0;237753;25.346;;S
1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S
我想要这个输出:
123;rr;2;RRyO, chess mobil;pio;25;1;0;24353;21.876;;S
1243;rho;9;RpO, chess yext cat;downpio;67;1;0;237753;25.346;;S
1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S
我试过这个代码:
sed -e '/^.\+pio$/,/^\..\*;[[:digit:]];[[:digit:]];.\*;.\*;.\*;.\*[[:space:]]$/d' data.csv
但是没用...
有什么建议吗?
我还没有对你的 sed 命令进行完全逆向工程,但这似乎有效:
sed 's/\(.*pio;[0-9]*\)\.[0-9]*//' data.csv
您可以使用
sed 's/^\(\([^;]*;\)\{5\}[0-9]*\)[^;]*//' data.csv
详情:
^
- 字符串开头
\(\([^;]*;\)\{5\}[0-9]*\)
- 第 1 组 (</code>):
<ul>
<li><code>\([^;]*;\)\{5\}
- 除 ;
和 ;
之外的任意零个或多个字符出现五次
[0-9]*
- 零个或多个数字
[^;]*
- ;
. 以外的零个或多个字符
参见online demo:
s='123;rr;2;RRyO, chess mobil;pio;25.766;1;0;24353;21.876;;S
1243;rho;9;RpO, chess yext cat;downpio;67.98;1;0;237753;25.346;;S
1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S'
sed 's/^\(\([^;]*;\)\{5\}[0-9]*\)[^;]*//' <<< "$s"
输出:
123;rr;2;RRyO, chess mobil;pio;25;1;0;24353;21.876;;S
1243;rho;9;RpO, chess yext cat;downpio;67;1;0;237753;25.346;;S
1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S
使用您显示的示例,请尝试执行以下操作。您可以通过 awk
的 sprintf 函数将浮点数简单地转换为数字。
awk 'BEGIN{FS=OFS=";"} {=sprintf("%d",)} 1' Input_file
来自 awk
的手册页:
sprintf(fmt, expr-list) Print expr-list according to fmt, and return
the resulting string.
这可能适合您 (GNU sed):
sed -E 's/([0-9]+)(\.[0-9]+)?|([^;]+)//6' file
字段可以是数字,带小数点的数字或不带小数点的数字。
第六个这样的字段return只有数字部分存在。
我正在处理一个 csv 文件,我想用特定列的小数截断数字。 其中三行是:
123;rr;2;RRyO, chess mobil;pio;25.766;1;0;24353;21.876;;S
1243;rho;9;RpO, chess yext cat;downpio;67.98;1;0;237753;25.346;;S
1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S
我想要这个输出:
123;rr;2;RRyO, chess mobil;pio;25;1;0;24353;21.876;;S
1243;rho;9;RpO, chess yext cat;downpio;67;1;0;237753;25.346;;S
1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S
我试过这个代码:
sed -e '/^.\+pio$/,/^\..\*;[[:digit:]];[[:digit:]];.\*;.\*;.\*;.\*[[:space:]]$/d' data.csv
但是没用... 有什么建议吗?
我还没有对你的 sed 命令进行完全逆向工程,但这似乎有效:
sed 's/\(.*pio;[0-9]*\)\.[0-9]*//' data.csv
您可以使用
sed 's/^\(\([^;]*;\)\{5\}[0-9]*\)[^;]*//' data.csv
详情:
^
- 字符串开头\(\([^;]*;\)\{5\}[0-9]*\)
- 第 1 组 (</code>): <ul> <li><code>\([^;]*;\)\{5\}
- 除;
和;
之外的任意零个或多个字符出现五次
[0-9]*
- 零个或多个数字
[^;]*
- ;
.参见online demo:
s='123;rr;2;RRyO, chess mobil;pio;25.766;1;0;24353;21.876;;S
1243;rho;9;RpO, chess yext cat;downpio;67.98;1;0;237753;25.346;;S
1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S'
sed 's/^\(\([^;]*;\)\{5\}[0-9]*\)[^;]*//' <<< "$s"
输出:
123;rr;2;RRyO, chess mobil;pio;25;1;0;24353;21.876;;S
1243;rho;9;RpO, chess yext cat;downpio;67;1;0;237753;25.346;;S
1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S
使用您显示的示例,请尝试执行以下操作。您可以通过 awk
的 sprintf 函数将浮点数简单地转换为数字。
awk 'BEGIN{FS=OFS=";"} {=sprintf("%d",)} 1' Input_file
来自 awk
的手册页:
sprintf(fmt, expr-list) Print expr-list according to fmt, and return the resulting string.
这可能适合您 (GNU sed):
sed -E 's/([0-9]+)(\.[0-9]+)?|([^;]+)//6' file
字段可以是数字,带小数点的数字或不带小数点的数字。
第六个这样的字段return只有数字部分存在。