如何使用 逆序输出一行awk
?我使用这个结构:
{
for (i = NF; i > 1; i--){
print $i
}
}
但它只打印一个字符串中的一个单词。
前:
apple pen dog cat
后:
cat dog pen apple
答案1
awk '
{
for (i=NF; i>=1; i--) {
printf "%s%s", $i, i == 1 ? ORS : OFS
}
}
' file
答案2
使用珀尔车道:
perl -lane 'print join " ", reverse @F' file
答案3
OFS
在打印当前记录之前交换当前记录中的字段的变体(如果在命令行(使用-v
)或代码中的其他位置设置了输出字段分隔符,则将使用 的当前值awk
)。
$ awk '{ for (i = 1; i < NF/2; ++i) { t = $i; $i = $(NF-i+1); $(NF-i+1) = t } }; 1' file
cat dog pen apple
只是awk
代码,使用显式print
而不是1
调用默认操作的简写条件:
{
for (i = 1; i < NF/2; ++i) {
# swap $i and $(NF-i+1)
t = $i
$i = $(NF-i+1)
$(NF-i+1) = t
}
print
}
答案4
使用 GNU awk
,并保留字段之间的原始间距:
gawk -v FPAT='[[:space:]]+|[^[:space:]]+' -v ORS= '
{for (i = NF; i > 0; i--) print $i; print RT}'
在" foo bar baz"
输入上,它输出"baz bar foo "
。
假设输入是区域设置中正确编码的文本。
请注意,如果输入使用 MS-DOS 行分隔符,则最终会得到以回车符开头的行(前面可能有更多空格)。您可能需要通过 a-v RS='\r?\n'
来适应这些。