我有一个分隔文件,其前几个字段如下所示:
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
答案 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
或者,如果需要,请添加-n
和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|
答案 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|