
以下のエラーをスローするスクリプトがあります。誰か追跡できますか。過去 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 つの選択肢があります。
代わりに 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
。コンピューターは気にしません。それはあなたのためだけにあるのです。次のコマンドを実行するシェル スクリプトに変換します
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