Linux 在awk中打印出所有剩余变量

Linux 在awk中打印出所有剩余变量,linux,bash,awk,Linux,Bash,Awk,我正在尝试编写一个快速的awk脚本,该脚本将行转换为以下格式: AAAA BBBB CCCC DDDD... 到 这是我的剧本: { printf "%s %s %s %s", $3, $1, $2, $4 }; 这可以正常工作,除非原始输入行有4个以上的令牌,在这种情况下,第5个和后面的令牌不会被打印 我检查了一些答案,例如,但是它们依赖于将变量设置为“”,如果以后重用这些变量,这似乎会导致问题 有没有一种简单的方法可以将$4替换为类似“从$4到行尾的子字符串”?不一定“简单”,但也不是那

我正在尝试编写一个快速的awk脚本,该脚本将行转换为以下格式:

AAAA BBBB CCCC DDDD...

这是我的剧本:

{ printf "%s %s %s %s", $3, $1, $2, $4 };
这可以正常工作,除非原始输入行有4个以上的令牌,在这种情况下,第5个和后面的令牌不会被打印

我检查了一些答案,例如,但是它们依赖于将变量设置为
”,如果以后重用这些变量,这似乎会导致问题

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

不一定“简单”,但也不是那么难:

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

对循环使用

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

对于(i=4;i在这个简单的例子中,您需要的是:

$ awk '{t=$3; $3=$2; $2=$1; $1=t}1' file
CCCC AAAA BBBB DDDD
但一般来说,GNU awk用于
gensub()
\s
\s

$ 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()

sub()
和一个变量:

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


@Mauris的可能副本这是该问题的副本,但该问题中的所有答案充其量都很麻烦,大多数都不希望添加和/或删除空格,并且对于只希望记录结尾按原样打印的一般情况,这些答案都是错误的。虽然此答案可能是正确和有用的,但如果您包括我们需要一些解释来解释它是如何帮助解决问题的。如果有一个变化(可能是无关的)导致它停止工作,并且用户需要了解它曾经是如何工作的,那么这在将来尤其有用。
$ 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($0,/^[[:space:]]*([^[:space:]]+[[:space:]]+){3}/); print $3, $1, $2, substr($0,RLENGTH+1)}' file
CCCC AAAA BBBB DDDD    EEEE    FFFF  GGGG
$ awk '{x=$0; sub(/^[[:space:]]*([^[:space:]]+[[:space:]]+){3}/,"",x); print $3, $1, $2, x}' file
CCCC AAAA BBBB DDDD    EEEE    FFFF  GGGG
perl -lane '($F[0], $F[2]) = ($F[2], $F[0]); print "@F"' file