Linux 在awk中打印出所有剩余变量
我正在尝试编写一个快速的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到行尾的子字符串”?不一定“简单”,但也不是那
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