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腳本運行。那是行不通的。你有兩個選擇:

  1. 相反,將其作為 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以免讓您感到困惑。電腦不會關心,它就在那裡為你服務。

  2. 將其轉換為運行命令的 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
    

相關內容