簡體   English   中英

awk 命令在 shell 腳本中未發現錯誤,但在終端中運行良好

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM