【问题标题】:awk swapping first two fields gives weird bugawk 交换前两个字段会产生奇怪的错误
【发布时间】:2012-02-29 00:12:17
【问题描述】:

我正在玩 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

它将所有分号替换为空格。

【问题讨论】:

    标签: unix awk


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      这意味着您将需要显式地重新生成该行

      打印 $2, ":", $1, ":", $3, ":"...

      或以类似的方式使用 printf。

      sed 在这里可能是一个更好的选择——您可以使用正则表达式替换来交换前两个字段。或者,您可以在 awk 中使用 sub 或 gsub 函数做同样的事情,但这可能更痛苦。

      顺便说一句,您可能希望 /cjares/ 和操作之间有一个空格。

      【讨论】:

      • 首先,如何重新生成线路?其次,空间是否重要,还是只是“适当”?我只是在打字,我无意让它们变得漂亮。
      • 我使用 awk 解决了这个问题:awk '{printf $2,$1; for(i=3;i<NF;i++) printf ":%s",$i; printf "\n"}' file,但我也在研究 sed。很有意思。我还是有点好奇,当我编辑 $1 或 $2 时,为什么 awk 会用 $0 中的空格替换分号。
      • 因为默认的输出字段分隔符是空格。您可以将其更改为 : 如果您愿意。请参阅 awk 文档。
      猜你喜欢
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      相关资源
      最近更新 更多