比较两个文件中的每个元素(按行)



我有三个文件,希望在两个文件之间逐行比较每个元素,并希望应用条件语句。

文件1示例

Aa 1.3
Ca 1.1
Ba 0.8
Da 0.65
Fa 0.63
Ea 0.6
Za 0.4
Ha 0.1

文件2示例

Ca Ba Da Fa Ea Za Ha
Aa Ca Ba Da Fa Ea

文件3示例

Fa Ca Za
Ha Ca Ba Da

现在我想逐行比较file2和file3的元素。若文件2的特定行的元素存在于文件3的同一行中,则执行某些操作,而不是执行其他任务。

我尝试过,但没有成功

NG=`cat file1 | awk 'END{print NR}'`
awk -v N="$NG" '
FNR==NR{
a[$0]=$0
next
}
{
for(i=1;i<=NF;i++){
if($i in a){
print sqrt((N-M)/M)
}
else
{
print -sqrt(M/(N-M))
}}
}' file2 file3 

其中N是文件1中的行数,M是文件3中特定行中的字段数。文件2所以我期望的输出文件像

1.29099 -0.774597 -0.774597 1.29099 -0.774597 1.29099 -0.774597
-1 1 1 1 -1 -1

您可以尝试以下awk脚本。

awk -v N="$(wc -l < file1)" '{for (i=1;i<=NF;i++) {arr[$i]}; M=NF; getline<"file2"; for (i=1; i<=NF; i++){if ($i in arr){printf "%f ", sqrt((N-M)/M)} else{printf "%f ", -sqrt(M/(N-M))}}; delete arr; print ""}' file3

扩展版本:

awk -v N="$(wc -l < file1)" '{
for (i=1;i<=NF; i++) {
arr[$i]
}
M = NF
getline < "file2"
for (i = 1; i <= NF; i++) {
if ($i in arr) {
printf "%f ", sqrt((N - M) / M)
} else {
printf "%f ", -sqrt(M / (N - M))
}
}
delete arr
print ""
}' file3

从你的问题中的文本来看,这可能是你想要做的:

$ cat tst.awk
FILENAME == ARGV[1] {
n = FNR
}
FILENAME == ARGV[2] {
for (i=1; i<=NF; i++) {
keys[FNR,$i]
}
presVals[FNR] = sqrt( (n - NF) / NF )
abstVals[FNR] = -sqrt( NF / (n - NF) )
}
FILENAME == ARGV[3] {
for (i=1; i<=NF; i++) {
val = ( (FNR,$i) in keys ? presVals[FNR] : abstVals[FNR] )
printf "%s%s", val, (i<NF ? OFS : ORS)
}
}

$ awk -f tst.awk file1 file3 file2
1.29099 -0.774597 -0.774597 1.29099 -0.774597 1.29099 -0.774597
-1 1 1 1 -1 -1

但您的预期输出似乎与您的样本输入不匹配,所以请确定这是否是您真正想要的。

顺便说一句,不要使用所有的大写变量名称,如NM,以避免与内置变量发生冲突,并通过使代码看起来像是在使用内置变量而使代码变得模糊。

相关内容

  • 没有找到相关文章

最新更新