awk 命令的问题

awk 命令的问题

我有一个脚本抛出以下错误,任何人都可以跟踪我在过去的 4 个小时里一直困在这个问题上

该脚本包含以下内容: vi bb.sh

#!/bin/awk -f
'BEGIN{FS=OFS="|"} NR==FNR{$1="";++a[$0];next} {field1=$1;$1=""; if ( !(a[$0]) ) {$1=field1;print $0} }' /home/path/a.txt  /home/path/b.txt >  /home/path/c.txt

执行后报错:

-bash-4.2$ sh bb.sh
bb.sh: line 2: BEGIN{FS=OFS="|"} NR==FNR{$1="";++a[$0];next} {field1=$1;$1=""; if ( !(a[$0]) ) {$1=field1} }: command not found

答案1

awk脚本中缺少您:

awk 'BEGIN{FS=OFS="|"} NR==FNR{$1="";++a[$0];next} {field1=$1;$1=""; if ( !(a[$0]) ) {$1=field1;print $0} }' \
/home/path/a.txt  /home/path/b.txt >  /home/path/c.txt

该脚本可能还应该有#!/bin/sh第一行。

或者,您可以将脚本转换为正确的awk脚本:

#!/usr/bin/awk -f

BEGIN {FS = OFS = "|"} 

NR==FNR { $1="";++a[$0]; next }

{
  field1 = $1;
  $1 = ""; 
  if ( !(a[$0]) ) {
     $1 = field1;
     print $0;
  }
}

...然后运行它,例如

$ ./bb.awk /home/path/a.txt /home/path/b.txt >/home/path/c.txt

答案2

您有一个awk脚本,但正在尝试将其作为sh脚本运行。那是行不通的。你有两个选择:

  1. 相反,将其作为 awk 脚本运行。由于您的文件已经有一个 shebang 行 ( #!/bin/awk -f),因此只需删除引号和输入文件即可:

    #!/bin/awk -f
    BEGIN{FS=OFS="|"} NR==FNR{$1="";++a[$0];next} {field1=$1;$1=""; if ( !(a[$0]) ) {$1=field1;print $0} }
    

    然后,使其可执行(chmod a+x bb.sh),并运行它:

    ./bb.sh  /home/path/a.txt  /home/path/b.txt >  /home/path/c.txt
    

    您可能还想删除.sh扩展名或将其重命名,.awk以免让您感到困惑。计算机不会关心,它就在那里为你服务。

  2. 将其转换为运行命令的 shell 脚本awk

    #!/bin/sh
    awk 'BEGIN{FS=OFS="|"} NR==FNR{$1="";++a[$0];next} {field1=$1;$1=""; if ( !(a[$0]) ) {$1=field1;print $0} }' /home/path/a.txt  /home/path/b.txt >  /home/path/c.txt
    

相关内容