gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:49:30 24 4
gpt4 key购买 nike

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

最佳答案

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

$ 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() 执行相同的操作:

$ 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

关于linux - 在 awk 中打印出所有剩余的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30177029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com