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

Mik*_*ren 3 linux bash awk

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

AAAA BBBB CCCC DDDD...
Run Code Online (Sandbox Code Playgroud)

CCCC AAAA BBBB DDDD...
Run Code Online (Sandbox Code Playgroud)

这是我的脚本:

{ printf "%s %s %s %s", $3, $1, $2, $4 };
Run Code Online (Sandbox Code Playgroud)

这种方法很好,除非原始输入行具有多于4个标记,在这种情况下,不会打印第5个和后续标记.

我检查了一些答案,例如使用awk打印从第n个到最后一个列的所有列,但它们依赖于设置变量,""如果稍后重用这些变量,这些变量似乎会导致问题.

是否有一种简单的方法可以替换$4为"从4美元到行尾"的子字符串?

Ed *_*ton 6

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

$ awk '{t=$3; $3=$2; $2=$1; $1=t}1' file
CCCC AAAA BBBB DDDD
Run Code Online (Sandbox Code Playgroud)

但一般用GNU awk for gensub(),\s\S:

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

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
Run Code Online (Sandbox Code Playgroud)

使用其他awks,你可以做同样的事情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
Run Code Online (Sandbox Code Playgroud)

或者sub()变量:

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