我正在尝试编写一个快速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美元到行尾"的子字符串?
在这个简单的情况下,您只需要:
$ 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)
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |