使用 awk 以相反的顺序输出一行中的单词

使用 awk 以相反的顺序输出一行中的单词

如何使用 逆序输出一行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' 来适应这些。

相关内容