【问题标题】:Print out all remaining variables in awk打印出 awk 中所有剩余的变量
【发布时间】:2015-05-12 09:24:43
【问题描述】:

我正在尝试编写一个快速的 awk 脚本,以这种格式转换行:

AAAA BBBB CCCC DDDD...

CCCC AAAA BBBB DDDD...

这是我的脚本:

{ printf "%s %s %s %s", $3, $1, $2, $4 };

这可以正常工作,除非原始输入行有超过 4 个标记,在这种情况下不打印第 5 个和后面的标记。

我检查了一些答案,例如 Using awk to print all columns from the nth to the last,但它们依赖于将变量设置为 "",如果以后重用这些变量,这似乎会导致问题。

有没有一种简单的方法可以将$4 替换为“从$4 到行尾的子字符串”?

【问题讨论】:

  • @Mauris 它是该问题的副本,但该问题中的所有答案充其量都是繁琐的,大多数添加和/或删除空格都是不受欢迎的,而且对于您的一般情况来说,它们都是错误的只想按原样打印记录的结尾。

标签: linux bash awk


【解决方案1】:

在这种简单的情况下,您只需要:

$ awk '{t=$3; $3=$2; $2=$1; $1=t}1' file
CCCC AAAA BBBB DDDD

但对于gensub()\s\S,通常使用GNU awk:

$ awk '{print $3, $1, $2, gensub(/^\s*(\S+\s+){3}/,"","")}' file
CCCC AAAA BBBB DDDD

gensub() 只是跳过前 3 个字段,从那时起将保留所有字段和字段之间的空格:

$ cat file
AAAA BBBB CCCC DDDD    EEEE    FFFF  GGGG

$ awk '{print $3, $1, $2, gensub(/^\s*(\S+\s+){3}/,"","")}' file
CCCC AAAA BBBB DDDD    EEEE    FFFF  GGGG

对于其他 awk,您可以对 match()+substr() 执行相同操作:

$ awk '{match($0,/^[[:space:]]*([^[:space:]]+[[:space:]]+){3}/); print $3, $1, $2, substr($0,RLENGTH+1)}' file
CCCC AAAA BBBB DDDD    EEEE    FFFF  GGGG

sub() 和一个变量:

$ awk '{x=$0; sub(/^[[:space:]]*([^[:space:]]+[[:space:]]+){3}/,"",x); print $3, $1, $2, x}' file
CCCC AAAA BBBB DDDD    EEEE    FFFF  GGGG

【讨论】:

    【解决方案2】:

    使用for 循环:

    { printf("%s %s %s", $3, $1, $2); 
      for (i = 4; i <= NF; i++) printf("%s ", $i); 
      printf("\n"); 
    }
    

    【讨论】:

      【解决方案3】:

      不一定“容易”,但也没那么难:

      {  printf "%s %s %s ", $3, $1, $2;
         for (i=4; i<= NF; ++i) {
             printf "%s ", $i;
         }
         printf "\n";
      }
      

      另一种方式,更聪明一点:

      { N3 = $3; N2 = $2; N1 = $1;  // capture the fields
        $1 = N3; $2 = N1; $3 = N2;  // reorder the fields
        print;  // print the whole record
      }
      

      【讨论】:

        【解决方案4】:

        Perl:

        perl -lane '($F[0], $F[2]) = ($F[2], $F[0]); print "@F"' file
        

        【讨论】:

        • 虽然这个答案可能是正确且有用的,但最好在其中附上一些解释来解释它如何帮助解决问题。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。
        猜你喜欢
        • 2011-03-04
        • 1970-01-01
        • 2013-10-05
        • 1970-01-01
        • 2013-08-29
        • 2018-10-25
        • 1970-01-01
        • 2016-01-02
        • 2010-12-22
        相关资源
        最近更新 更多