bash 腳本讀取第一個參數作為輸入並在另一個檔案中逐行尋找變量

bash 腳本讀取第一個參數作為輸入並在另一個檔案中逐行尋找變量

我有一個檔案“input.txt”,其中包含變數 A1、A2、A3、θ、θ1 和 θ2 - input.txt 的範例如下:

$ cat input1.txt 

A1=5.2 A2=4.9  A3=6.1 θ=space    θ1=2.5 θ2=1.2 

A1=3.1 A2=5.1  A3=3.7 θ=triangle θ1=8.1 θ2=3.9

我想創建一個腳本來運行檔案 input.txt - 該檔案將作為第二個參數傳遞,第一個參數將是 θ 的值

我創建了一個腳本,如下所示:

#! /bin/bash

file=input1.txt

if grep -q $1 "$file"; 
then
awk -F '[= ]+' '{ print $12 }' <$2

else

echo "Not available"
fi
}

但是當我按如下方式運行此腳本時:

./script space input.txt   

(第一個參數是 θ 的值,第二個參數是檔案名稱),輸出是欄位 12 中的所有值:

$ ./script1 space input1.txt 
1.2
3.9

輸出應該只是 1.2,我搜尋並發現我需要創建一個循環來逐行讀取文件,但我無法讓它工作。

答案1

您可以在以下位置完成所有工作awk

#!/bin/sh
file=$2

awk -v theta="$1" -F '[= ]+' '
        $0 ~ theta { print $12; found++ }
        END        { if (!found) { print "Not available"; exit 1 } }' "$file"

您可能需要新增錯誤處理來驗證是否有兩個命令列參數,並且$2是可讀檔案的名稱,因為

  • 如果$2不是可讀文件,您將收到一條錯誤訊息awk
  • 如果$2為空或不存在, awk將從標準輸入中靜默讀取。

(當然,您可能可以接受其中一種或兩種行為。)

筆記:

  • $0 ~ theta透過更改為 ,您可能會獲得更有針對性的結果$8 == theta
  • 中的變數awk被初始化為空白。這在數學上下文中被視為 0,因此在第一次執行時found++設定為 1。found我故意這樣說,found++而不是found = 1這樣,如果多行匹配theta值, found將被設定為數位這樣的線路。這看起來應該是個錯誤條件;如果你擔心的話,你可以修改該區塊,如果不是 1,END則報告錯誤。found
  • 當然,如果您需要腳本在找到值時執行一件事,而在未找到值時執行其他操作,則可以printEND區塊中刪除該語句,並讓腳本僅測試awk退出狀態並發出自己的錯誤訊息。如果您想捕捉 的輸出awk(即 θ2 值),您也應該這樣做。相反,如果您需要的只是人類可讀的錯誤訊息,並且不需要能夠檢查退出狀態,則可以exit從區塊中刪除該語句END

答案2

嘗試這個:

#! /bin/bash

file=input1.txt

if grep -q $1 "$file";
then
        grep $1 $2 | awk -F '[= ]+' '{ print $12 }'
else
        echo "Not available"
fi

答案3

看起來你的邏輯可以歸結為:

grep -om1 "$1" < "$2" ||
echo 'Not available.'

grep....無論如何,提供了一個 GNU 。不過,如果是我,我會放棄echo,或至少會…

! echo 'Not available.' >&2

……反而。

相關內容