首页 > 解决方案 > 为什么这个 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

标签: awk

解决方案


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] }

推荐阅读