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
答案 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"