首页 > 解决方案 > 如何使用 AWK 反向打印每个单元格中的字符串字符?

问题描述

Beth    45  4.00    0   0   .072
Danny   33  3.75    ^0  0   .089

以上就是我要操作的文件。

我想编写一个 AWK 脚本,可以在每个单元格中反向打印字符串的字符。

这是代码:

BEGIN { OFS = "\t\t" } 
function reverse_print(str)
{
    s = ""; 
    N = length(str);
    for (i = 1; i <= N; i++)
        a[i] = substr(str, i, 1); 
    for (i = N; i >= 1; i--)
        s = s  a[i];
    return s;
}

{
    for (i = 1; i <= NF; i++)
        $i = reverse_print($i) ; 
    print;
}

END {}

但是,它不起作用。程序不知何故死了。

我发现如果我不使用循环并像下面这样一个一个地处理每个字段,

BEGIN { OFS = "\t\t" }
function reverse_print(str)
{
    s = "";
    N = length(str);
    for (i = 1; i <= N; i++)
        a[i] = substr(str, i, 1);
    for (i = N; i >= 1; i--)
        s = s  a[i];
    return s;
}

{
    $1 = reverse_print($1) ; 
    $2 = reverse_print($2) ; 
    $3 = reverse_print($3) ; 
    $4 = reverse_print($4) ; 
    $5 = reverse_print($5) ; 
    $6 = reverse_print($6) ; 
    print;
}

END {}

它可以很好地工作。

这是我想要的输出:

hteB        54      00.4        0       0       270.
ynnaD       33      57.3        0^      0       980.

我仔细考虑过,但仍然无法弄清楚我在使用循环时做错了什么。

谁能告诉我为什么?

标签: stringawkprintingfieldreverse

解决方案


您在i函数内部和外部使用相同的变量。在任一位置使用不同的变量或更改函数定义以reverse_print(str, i)使i函数内的 used 成为该函数的局部变量,而不是调用代码中使用的相同全局变量。

您还应该将 s 和 N 函数设为本地:

function reverse_print(str,     i, s, N)

但实际上代码应该写成:

$ cat tst.awk
BEGIN { OFS = "\t\t" }
function reverse_print(fwd,     rev, i, n)
{
    n = length(fwd)
    for (i = n; i >= 1; i--)
        rev = rev substr(fwd, i, 1);
    return rev
}

{
    for (i = 1; i <= NF; i++)
        $i = reverse_print($i)
    print
}

$ awk -f tst.awk file
hteB            54              00.4            0               0               270.
ynnaD           33              57.3            0^              0               980.

推荐阅读