
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
awk
Im 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/sh
als erste Zeile Folgendes haben:
Alternativ können Sie das Skript auch in ein richtiges awk
Skript 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 awk
Skript, versuchen aber, es als sh
Skript auszuführen. Das funktioniert nicht. Sie haben zwei Möglichkeiten:
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
.sh
Erweiterung auch entfernen oder umbenennen,.awk
damit Sie nicht verwirrt werden. Dem Computer ist das egal, sie ist nur für Sie da.Konvertieren Sie es in ein Shell-Skript, das den folgenden
awk
Befehl 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