Problem mit dem awk-Befehl

Problem mit dem awk-Befehl

Ich habe ein Skript, das den folgenden Fehler auslöst. Kann jemand es nachvollziehen? Ich stecke seit 4 Stunden daran fest.

Das Skript enthält Folgendes: 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

Fehler nach der Ausführung:

-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

Antwort1

awkIm Skript fehlt :

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

Das Skript sollte wahrscheinlich auch #!/bin/shals erste Zeile Folgendes haben:

Alternativ können Sie das Skript auch in ein richtiges awkSkript umwandeln:

#!/usr/bin/awk -f

BEGIN {FS = OFS = "|"} 

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

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

... und führen Sie es dann aus mit, zB

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

Antwort2

Sie haben ein awkSkript, versuchen aber, es als shSkript auszuführen. Das funktioniert nicht. Sie haben zwei Möglichkeiten:

  1. Führen Sie es stattdessen als awk-Skript aus. Da Ihre Datei bereits eine Shebang-Zeile ( #!/bin/awk -f) enthält, entfernen Sie einfach die Anführungszeichen und die Eingabedateien:

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

    Machen Sie es dann ausführbar ( chmod a+x bb.sh) und führen Sie es aus:

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

    Möglicherweise möchten Sie die .shErweiterung auch entfernen oder umbenennen, .awkdamit Sie nicht verwirrt werden. Dem Computer ist das egal, sie ist nur für Sie da.

  2. Konvertieren Sie es in ein Shell-Skript, das den folgenden awkBefehl ausführt:

    #!/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
    

verwandte Informationen