打印出awk中的所有剩余变量

时间:2015-05-11 20:27:18

标签: linux bash awk

我正在尝试编写一个快速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到行尾的子字符串”?

4 个答案:

答案 0 :(得分:6)

在这个简单的案例中,您只需要:

$ 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

对于其他问题,您可以使用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

答案 1 :(得分:4)

这不一定“容易”,但并不难:

if ($('#rightSideWidget').length > 0) {
    var
        topOffset = $('#rightSideWidget').offset().top;

        $('#rightSideWidget').affix({
            offset: {
                // I want the rightSideWidget to be affixed when it's 110px
                // from page top, because I have a fixed navbar at top
                // has 110 px height
                top: topOffset - 110
            }
        })
        .on('affixed-top.bs.affix', function() {
            window.console.log($(window).scrollTop());
        });
}

另一种方式,有点聪明:

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

答案 2 :(得分:4)

使用{ N3 = $3; N2 = $2; N1 = $1; // capture the fields $1 = N3; $2 = N1; $3 = N2; // reorder the fields print; // print the whole record } 循环:

for

答案 3 :(得分:0)

的Perl:

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