【发布时间】:2014-07-17 14:27:23
【问题描述】:
(这是我在这里的第一篇文章,所以如果我问错了问题,请原谅我。)
我正在我的 OSX Maverick 上学习 awk。我在 awk 上通过 this tutorial。
我正在尝试重现类似于该教程中的 awk_example4a.awk 的内容。
所以我想出了这个 awk 程序/脚本/参数(不知道你怎么称呼它??):
BEGIN { i=1 }
{
print "Line " i;
print "$1 is " $1,"\n$2 is " $2, "\n$3 is " $3;
FS=":";
$0=$0;
print "With the new FS - line " i;
print "$1 is " $1,"\n$2 is " $2, "\n$3 is " $3;
FS=" ";
i++;
}
输入文件如下所示:
A1 B1:B2 C2
A1:A2 B2:B3 C3
我要做的是首先使用默认的FS(空格)处理每一行/记录,然后使用新的FS(“:”)重新处理相同的行/记录,然后恢复默认值FS 在转到下一条记录之前。
根据教程,$0=$0 应该让 awk 使用新的字段分隔符重新评估字段,因此应该给我一个如下所示的输出:
Line 1
$1 is A1
$2 is B1:B2
$3 is C2
With the new FS - line 1
$1 is A1 B1
$2 is B2 C2
$3 is
Line 2
$1 is A1:A2
$2 is B2:B3
$3 is C3
With the new FS - line 2
$1 is A1
$2 is A2 B2
$3 is B3 C3
但相反,我得到:
Line 1
$1 is A1
$2 is B1:B2
$3 is C2
With the new FS - the line 1
$1 is A1
$2 is B1:B2
$3 is C2
Line 2
$1 is A1:A2
$2 is B2:B3
$3 is C3
With the new FS - the line 2
$1 is A1:A2
$2 is B2:B3
$3 is C3
即FS 更改后,这些字段尚未重新评估。
如果$0=$0 不起作用($1=$1; $2=$2 之类的东西也不起作用),我如何让 awk 使用不同的 FS 重新评估同一行?
谢谢。
【问题讨论】:
-
如果我打印
print "With the new FS - line " i; print "$1 is", $1和到目前为止,对我工作。调查原因。 -
使用与您发布的完全相同的脚本为我工作?
-
如何启动它?你文件中的shebang是什么?
#!/bin/bash或#!/usr/bin/awk -f或其他? -
我的确切命令行是:
cat input.txt | awk -f test.awk。并且test.awk在文件的开头有一个额外的#!/bin/awk -f。编辑:我将shebang更改为#!/usr/bin/awk -f,结果没有改变。 -
一种解决方法是将 $0 的每个元素分配给一个数组并从那里处理和打印。我最近也遇到了尝试像这样使用
FS的问题。就 Mac OSX 而言,我建议安装 Homebrew,这样您就可以无缝安装 GAWK(即 GNU AWK),这种东西可能更灵活,而且 afaik 无论如何都是大多数 Linux 系统上的标准 AWK 实现. Mavericks 附带的 AWK(我认为)是 BSD 的 AWK 的一些变体,无论如何它缺少 GAWK 的一些不错的功能。