在外壳程序脚本中未找到Awk命令错误,但在终端中运行正常

时间:2019-11-27 05:30:23

标签: bash awk

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

2 个答案:

答案 0 :(得分:1)

请您尝试以下。

#!/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的尝试中看起来并不完整。

答案 1 :(得分:0)

关于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"