在awk中处理之前,将字段添加到当前记录

在awk中处理之前,将字段添加到当前记录,awk,Awk,我想使用一个大的awk脚本,它被设计用来接受特定的输入。例如“城市zipcode street housenumber”,所以$2是zipcode,等等 现在输入以新的格式提供给我。在我的例子中,“城市”现在不见了。新文件是“zipcode street housenumber”(不是真的,只是想让示例变得简单) 但是我碰巧知道城市对于输入来说是一个常数(这就是为什么它不在数据集中的原因)。因此,如果我运行它通过原始脚本$2现在是街道,一切都是一个领域了 我可以首先处理输入文件,将城市名称预先添

我想使用一个大的awk脚本,它被设计用来接受特定的输入。例如“城市zipcode street housenumber”,所以$2是zipcode,等等

现在输入以新的格式提供给我。在我的例子中,“城市”现在不见了。新文件是“zipcode street housenumber”(不是真的,只是想让示例变得简单) 但是我碰巧知道城市对于输入来说是一个常数(这就是为什么它不在数据集中的原因)。因此,如果我运行它通过原始脚本$2现在是街道,一切都是一个领域了

我可以首先处理输入文件,将城市名称预先添加到每一行(使用awk、sed或其他方法),然后通过原始脚本运行它,但我更愿意只运行一个支持这两种格式的脚本。我可以添加一个命令行选项,告诉它城市,但我不知道如何将它插入脚本顶部当前记录的前面,以便脚本的其余部分可以保持不变。看起来我可以更改字段,但我要做的是将字段“移位”到右侧,以便修改$1


我说过我是一个完全的awk新手吗?(Perl是我的毒药。)

我想我已经解决了自己的问题,我正在做以下工作(还没有找到如何根据命令行选项有条件地完成这项工作,但应该很容易找到相关教程)


我在上面的评论中的循环是错误的,但是操纵NF和将字段复制到其他字段的基本思想似乎是可行的。首先是一些遗漏的测试数据:

$ cat file
1 2 3 4
2 3 4
awk:

$ awk -v c=V '{      # define external var
    if(NF==3)        # if record has only three fields
        $0=v FS $0   # prepend the var to the record
    print $1         # print first field 
}' file
输出:

1
V

所以
awk-vcity=“$city”{if(length(city)){a[1]=city;a[2]=$1;a[3]=$2;}否则{a[1]=$1;a[2]=$2;a[3]=$3;}
?这不就是构建一个数组,然后在脚本的其余部分中使用它,所以我必须编辑脚本的其余部分以使用[3]而不是$3,等等吗?我正在尝试使用:for(I=NF;I>1;--I)进行转换$(i-1)=$(i);NF+=1;但现在我似乎根本无法运行原始脚本,我得到的只是(没有这样的文件或目录),所以我需要在尝试转换之前解决这个问题。您不能像bash中那样在awk中
shift
set--arg
。使用数组
我正在尝试
我得到的只是
请使用示例输入、您尝试过的脚本以及您希望获得的预期输出更新您的问题。请发一封邮件。你确定你永远不需要处理温哥华市以外的地址吗?是加拿大不列颠哥伦比亚省的温哥华还是美国华盛顿州的温哥华?$1=mycity和mycity作为-v mycity=Paris或其他的参数传递。同样,“城市”的例子不是真正的应用程序,只是一种框架我的问题的方式。我现在很满意我已经用一种适合我的方式解决了我的问题。
1
V