【发布时间】:2016-04-13 14:28:14
【问题描述】:
我将ORS 更改为,。我发现记录分隔符在最后一条输出记录之后应用。有什么办法让它不适用于最后的输出记录?
同样。 OFS 是否也适用于最后一个字段?如果可以,我可以不做吗?
【问题讨论】:
标签: awk
我将ORS 更改为,。我发现记录分隔符在最后一条输出记录之后应用。有什么办法让它不适用于最后的输出记录?
同样。 OFS 是否也适用于最后一个字段?如果可以,我可以不做吗?
【问题讨论】:
标签: awk
有几个技巧。
一种是,不使用内置 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?
echo "a b c" | awk 'BEGIN {OFS=","}; {$1=$1;print $0};' 检查OFS 是否适用于最后一个字段之后。输出是a,b,c,而不是a,b,c,。似乎它不适用于最后一个字段,对吗?那么“分隔符”对于记录和字段的含义是否不同?