awk交换前两个字段给出了奇怪的错误

时间:2012-02-27 23:36:46

标签: unix awk

我正在玩 awk 而我正在尝试交换文件的前两个字段,如下所示:

awk -F : '/cjares/{temp=$1; $1=$2; $2=temp; print}' /etc/passwd

然而,输出不对。这是两个输出,一个没有交换字段,第二个是在交换字段之后:

x cjares 3158 115 Caleb Timothy Jares,256 Avery Hall,2-7763 /home/ugrad/cjares /bin/tcsh
cjares:x:3158:115:Caleb Timothy Jares,256 Avery Hall,2-7763:/home/ugrad/cjares:/bin/tcsh

它用空格替换所有分号。

2 个答案:

答案 0 :(得分:1)

在awk中,默认输出字段分隔符(OFS)是一个空格“”。你可以改变它:

awk -F: 'BEGIN{OFS=":"} /cjares/{temp=$1; $1=$2; $2=temp; print}' /etc/passwd

答案 1 :(得分:-1)

不幸的是,你不会通过重新分配$ 1和$ 2来神奇地改变$ 0的值。 你需要明确告诉awk你想在这里打印什么。

这意味着您需要使用

显式重新生成该行

打印$ 2,“:”,$ 1,“:”,$ 3,“:”......

或以类似方式使用printf。

sed可能是一个稍微好一点的赌注 - 您可以使用正则表达式替换来交换前两个字段。或者,您可以使用sub或gsub函数在awk中执行相同的操作,但这可能会更加痛苦。

顺便说一句,你可能想要/ cjares /和动作之间的空格。