awk - 为什么这个 awk 脚本也打印原始文件?
问题描述
我有以下脚本:
ascript2.awk
#!/usr/bin/awk -f
BEGIN {FS=":"}
a[$1]=a[$1] ";" $2 " : " $3
END{
for (x in a) print x,a[x]}
当我让它运行时,它还会打印原始输入文件。为什么?当我制作这样的 bash 脚本时,它可以正常工作:
合并
#!/bin/bash
awk -F' *: *' '{a[$1]=a[$1] (a[$1]?" \\ " :" ; ") $2 ":" $3} END {for (x in a) print x,a[x]}' $1
输入:
Affe : 3 : test
Affe : 5 : test2
Money : 9 : test3
输出:
$ ./merge t.txt
Money ; 9:test3
Affe ; 3:test \ 5:test2
$ ./ascript2.awk t.txt
Affe : 3 : test
Affe : 5 : test2
Money : 9 : test3
Money ; 9 : test3
Affe ; 3 : test; 5 : test2
解决方案
in ascript2.awk
,a[$1]=a[$1] ";" $2 " : " $3
应该用大括号括起来,否则将被解释为没有动作的条件,并且任何没有动作的条件都将打印该行,如果且仅满足条件。(见:awk脚本末尾的1是什么意思
)
所以你的脚本应该是这样的:
#!/usr/bin/awk -f
BEGIN { FS=":" }
{ a[$1] = a[$1] ";" $2 " : " $3 }
END { for (x in a) print x, a[x] }
推荐阅读
- angular5 - Angular 中 enableProdMode() 的用途是什么
- java - 是否可以将字符串 10 与数字 10 相乘
- wordpress - 将来自 Linkedin 帖子的评论整合回 Wordpress
- keras - Keras 加载的 png 显示为全黑
- powershell - 列出 PowerShell 中特定用户的文件夹权限
- angularjs - 双语应用的AngularJs密码表
- node.js - 如何修复“多次调用 Api” - 一个非常奇怪的问题
- html - 使用 CSS 和 z-index,如何将作为子元素的子元素放置在顶部父元素之后?
- excel - 有没有办法使用VBA从excel中的网页下载多个pdf文件
- python - 如何将经过身份验证的用户链接到 formModel