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。これは機能しません。2 つの選択肢があります。

  1. 代わりに awk スクリプトとして実行します。ファイルにはすでにシェバン行 ( #!/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. 次のコマンドを実行するシェル スクリプトに変換します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
    

関連情報