我有一个脚本抛出以下错误,任何人都可以跟踪我在过去的 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
脚本运行。那是行不通的。你有两个选择:
相反,将其作为 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
以免让您感到困惑。计算机不会关心,它就在那里为你服务。将其转换为运行命令的 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