![](/img/trans.png)
[英]Mac Terminal Foreach Command Not Found While Running Shell Script
[英]Awk command not found error in shell script, but running fine in terminal
SC_mapping.csv:
2,4
3,6
文件2:
71,2
72,2
71,4
輸出:
71
72
程序:
#!/bin/bash
read -p "Enter the dump directory path: " PATH
read -p "Mapping path: " Mapping
echo $PATH
echo $Mapping
if [ -s $Mapping/SC_mapping.csv ]; then
echo
awk -F"," 'NR==FNR{c[$1];next} {if($2 in c){print $1} else{}}' $Mapping/SC_mapping.csv $PATH/file2 > Impacted_SC.csv
fi
你能不能試試以下。
#!/bin/bash
read -p "Enter the dump directory path: " userdir
read -p "Mapping path: " map
echo $userdir
echo $map
if [[ -s $map/SC_mapping.csv ]]
then
awk 'BEGIN{FS=","} FNR==NR{a[$1]=$2;next} ($2 in a){print $1,a[$2]}' "$map/SC_mapping.csv" "$userdir/file2" > "Impacted_SC.csv"
fi
以下是 OP 嘗試中的修復:
PATH
是默認變量,所以不應使用它。awk
命令,它在 OP 的嘗試中看起來並不完整。關於 OP 問題中的構造的旁注:使用c[$1]
添加收集元素,條件NR == FNR
:
雖然awk
info
文檔聲明引用數組元素會將其值設置為 null。 然而,這種行為並不為人所知,在任何其他主要的現代編程語言中都沒有發現,在man awk
也沒有明確提到,這通常是查找信息的第一點。 awk 信息頁: http : //kirste.userpage.fu-berlin.de/chemnet/use/info/gawk/gawk_12.html#SEC114查找If you refer to an array element that has no recorded value ...
信息頁面指出:( (In some cases, this is unfortunate, because it might waste memory inside awk.)
。 很容易看出多個非 awk 專家如何僅通過“檢查”數組條目來編寫需要大量內存的腳本。 許多開發人員(初學者和專家)將無法識別這種模式,因為他們沒有意識到副作用。 他們會假設,從 Java/C++/C# 使用a.get(k)
不會修改 a。
另一個結構是“FNR == NR”,它用作“我正在閱讀第一個文件”的同義詞。 對於偶爾的開發人員來說,這並不明顯。 在命令行中使用 TAG=... 標記不同的輸入文件更容易。
我的建議是避免這種結構,並使用稍長但更容易閱讀的代碼,借用一些想法以獲得其他答案:
awk -F"," '
# Map File
!DATA_TAG { a[$1]=$2; next}
# Main file
($2 in a) {print $1}
' "$map/SC_mapping.csv" DATA_TAG=MAIN "$userdir/file2" > "Impacted_SC.csv"
# Single line, more compact
awk -F"," '!DATA { a[$1]=$2; next} ($2 in a) {print $1}' "$map/SC_mapping.csv" DATA=1 "$userdir/file2" > "Impacted_SC.csv"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.