string - 如何使用 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.
我仔细考虑过,但仍然无法弄清楚我在使用循环时做错了什么。
谁能告诉我为什么?
解决方案
您在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.
推荐阅读
- javascript - 如何使用 onMouseDown 动态更新 NavBar 变量?
- outlook-restapi - 刷新令牌的请求无效
- python - 用python读取嵌套的json数据
- c# - 无法获取此实现的 CryptoAPI 加密服务提供程序 (CSP)
- c# - 在 Visual Studio 中,为什么所有文件都自动成为我的 C# 项目的一部分?
- java - MQTT 消息到 JSONObject
- autodesk-forge - 在 Forge 查看器中更改设置面板
- jquery - 如何在没有访问头部的情况下在 css 之前预加载字体?
- azure - 资源组名称不能为空?
- soap - 使用 TLS1.2 将 SSIS 连接到在线源失败