Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix awk交换前两个字段会产生奇怪的错误_Unix_Awk - Fatal编程技术网

Unix 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,我试图交换文件的前两个字段,如下所示:

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文档。