我正在尝试编写一个快速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到行尾的子字符串”?
答案 0 :(得分:6)
在这个简单的案例中,您只需要:
$ awk '{t=$3; $3=$2; $2=$1; $1=t}1' file
CCCC AAAA BBBB DDDD
但通常使用gensub()
,\s
和\S
的GNU awk:
$ 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
对于其他问题,您可以使用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
答案 1 :(得分:4)
这不一定“容易”,但并不难:
if ($('#rightSideWidget').length > 0) {
var
topOffset = $('#rightSideWidget').offset().top;
$('#rightSideWidget').affix({
offset: {
// I want the rightSideWidget to be affixed when it's 110px
// from page top, because I have a fixed navbar at top
// has 110 px height
top: topOffset - 110
}
})
.on('affixed-top.bs.affix', function() {
window.console.log($(window).scrollTop());
});
}
另一种方式,有点聪明:
{ printf "%s %s %s ", $3, $1, $2;
for (i=4; i<= NF; ++i) {
printf "%s ", $i;
}
printf "\n";
}
答案 2 :(得分:4)
使用{ N3 = $3; N2 = $2; N1 = $1; // capture the fields
$1 = N3; $2 = N1; $3 = N2; // reorder the fields
print; // print the whole record
}
循环:
for
答案 3 :(得分:0)
的Perl:
perl -lane '($F[0], $F[2]) = ($F[2], $F[0]); print "@F"' file