使用sed或awk,如何更改分隔线中的第一个字段?

时间:2013-03-13 18:20:56

标签: sed awk delimited-text

我有一个分隔文件,其前几个字段如下所示:

2774013300|184500|2012-01-04 23:00:00|

我希望更改第一个字段等于或超过8个字符的某些行。 我想截断第一列中的值。

如果是2774013300,我希望其值变为27740133

我想在sed中执行此操作,最好是awk

使用sed,我可以在行的开头找到任何超过8位的数字,但我不太确定如何截断它,我会假设使用替换。

sed -n -e /'^[0-9]\{10,\}/p' infile

我想我可以对前8个字符使用分组并在替换命令中返回,但我不太清楚如何做到这一点。

在awk中,我可以检测到第一个字段,但我不太确定如何使用substr来改变第一个字段然后返回剩余的字段,因此保留了一个完整的行。

awk -F'|'  '{ if (length($1) > 9) { print $1; print length($1);} }' infile

2 个答案:

答案 0 :(得分:4)

根据您的情况的微妙之处,您可以使用

sed 's/^\([0-9]\{8\}\)[0-9]*/\1/' infile

sed 's/^\([0-9]\{8\}\)[0-9]\{1,\}/\1/' infile
使用GNU sed的

可以简化为

sed -r 's/^([0-9]{8})[0-9]+/\1/' infile

或者,如果需要,请添加-np

示例:

$ sed 's/^\([0-9]\{8\}\)[0-9]*/\1/' <<<'2774013300|184500|2012-01-04 23:00:00|'
27740133|184500|2012-01-04 23:00:00|

答案 1 :(得分:1)

使用awk:

awk -F'|' 'BEGIN{OFS=FS}length($1)>9{$1=substr($1, 0,9)}{print}'

示例:

$ echo "2774013300|184500|2012-01-04 23:00:00|" | awk -F'|' 'BEGIN{OFS=FS}length($1)>9{$1=substr($1, 0,9)}{print}'
27740133|184500|2012-01-04 23:00:00|