1

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

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

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

2774013300I 的情况下,它的值变为 become 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
4

2 回答 2

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

或者,如果需要,添加-nand p

例子:

$ sed 's/^\([0-9]\{8\}\)[0-9]*/\1/' <<<'2774013300|184500|2012-01-04 23:00:00|'
27740133|184500|2012-01-04 23:00:00|
于 2013-03-13T18:26:47.317 回答
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|
于 2013-03-13T21:29:25.703 回答