【问题标题】:Make the record seperator in AWK not apply after the last record?在最后一条记录之后使AWK中的记录分隔符不适用?
【发布时间】:2016-04-13 14:28:14
【问题描述】:

我将ORS 更改为,。我发现记录分隔符在最后一条输出记录之后应用。有什么办法让它不适用于最后的输出记录?

同样。 OFS 是否也适用于最后一个字段?如果可以,我可以不做吗?

【问题讨论】:

    标签: awk


    【解决方案1】:

    有几个技巧。

    一种是,不使用内置 ORS。

    例如代替

    $ seq 5 | awk -v ORS=",\n" '{print $0}'
    1,
    2,
    3,
    4,
    5,
    

    这样做

    $ seq 5 | awk '{printf "%s%s",sep,$0; sep=",\n"} END{print ""}'
    1,
    2,
    3,
    4,
    5
    

    另一个技巧是从输入文件中删除最后一个新行并使用 RT 作为代理(可能只是 gawk)

    $ seq 5 | head -c -1 | awk -v ORS=",\n" '{printf "%s%s",$0,RT?ORS:""}'
    1,
    2,
    3,
    4,
    5   # <-- no newline here but you can add in the END block.
    

    对于 OFS,您可以执行类似的操作。

    $ paste <(seq 5) <(seq 11 15) 
      | awk -v OFS=, '{sep=""; for(i=1;i<=NF;i++) {printf "%s",sep $i*$i; sep=OFS} printf "\n"}'
    
    1,121
    4,144
    9,169
    16,196
    25,225
    

    请注意,如果您不是在循环中构造行,只需添加以逗号分隔的字段即可解决问题。例如print $1*$1, $2*$2

    【讨论】:

    • 从什么时候开始默认输出记录分隔符,\n?
    • 谁说这是默认的?以举例说明效果。如果它是默认值,则无论如何都不需要设置它们。
    • 非常抱歉!我又读了一遍这个问题。这都是我的错! +1
    • 谢谢。我通过echo "a b c" | awk 'BEGIN {OFS=","}; {$1=$1;print $0};' 检查OFS 是否适用于最后一个字段之后。输出是a,b,c,而不是a,b,c,。似乎它不适用于最后一个字段,对吗?那么“分隔符”对于记录和字段的含义是否不同?
    • 是的,除非您通过添加字段和 OFS 在循环中构造记录,否则最后一个字段不会附加 OFS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多