【问题标题】:Using sed or awk, how can I alter the first field in a delimited line?使用 sed 或 awk,如何更改分隔行中的第一个字段?
【发布时间】:2023-03-14 21:10:01
【问题描述】:

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

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

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

对于2774013300,我希望它的值变成27740133

我想在sedawk 中执行此操作。

使用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

【问题讨论】:

    标签: sed awk csv


    【解决方案1】:

    根据你的情况的细微差别,你可以使用

    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|
    

    【讨论】:

    • 谢谢。我去试试这个。我知道你现在在做什么,将前 8 个和可能的后两个分组,对吗?如果只有 8 个字符,最后两个应该留空?
    • @octopusgrabbus 您说“更改第一个字段等于或超过 10 个字符的某些行”,因此仅当至少有 10 位数字时才会匹配,并删除第 8 位之后的所有内容。如果您确实想更改 8 或更长的所有内容,请编辑问题,我将通过将 \{2,\} 更改为 * 来编辑答案。
    【解决方案2】:

    使用 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|
    

    【讨论】:

    • 感谢 awk 示例。我有一些不必要的复杂的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2012-04-07
    • 2013-05-03
    • 2016-07-01
    • 2019-09-16
    • 2018-09-15
    相关资源
    最近更新 更多