
我有一個檔案“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
- 當然,如果您需要腳本在找到值時執行一件事,而在未找到值時執行其他操作,則可以
print
從END
區塊中刪除該語句,並讓腳本僅測試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
……反而。