Unix awk交换前两个字段会产生奇怪的错误
我在玩awk,我试图交换文件的前两个字段,如下所示:Unix awk交换前两个字段会产生奇怪的错误,unix,awk,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 J
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
它将所有分号替换为空格。不幸的是,您无法通过重新分配$1和$2神奇地更改$0的值。 您需要明确地告诉awk您想要在这里打印什么 这意味着您需要使用 打印$2“:”、$1“:”、$3“:” 或者以类似的方式使用printf sed可能是一个更好的选择——您可以使用正则表达式替换来交换前两个字段。或者,您可以在awk中使用sub或gsub函数执行相同的操作,但这可能会更痛苦
顺便说一句,您可能需要在/cjares/和操作之间留一个空格。在awk中,默认的输出字段分隔符(OFS)是一个空格“”。您可以更改它:
awk -F: 'BEGIN{OFS=":"} /cjares/{temp=$1; $1=$2; $2=temp; print}' /etc/passwd
首先,如何重新生成该行?第二,空间是重要的,还是仅仅是“合适的”?我只是输入了一行代码,我不想让它们变得漂亮。我使用awk解决了它,就像这样:
awk'{printf$2,$1;for(I=3;I),因为默认的输出字段分隔符是空格。如果愿意,可以将其更改为:参见awk文档。