awk 无法识别数组的索引

awk 无法识别数组的索引

我有两个制表符分隔的文件,每个文件都有两列。我想创建一个文件,其中包含两个文件的第 1 列重叠的元素。为此,我首先将文件 1 放入数组中,然后扫描该数组以检查文件 2 是否有重叠。但是,不知何故无法识别数组的索引。问题的详细说明见下文。

文件的前 3 行如下所示:

文件一:

90001   raw acceleration data
2634    Heavy DIY
1011    Light DIY

文件2:

2634    218263
25680   44313
25681   44313

要显示两个文件的第 1 列存在重叠:

user@cluster:~> grep 90001 file2
90001   103662
user@cluster:~> grep 2634 file2
2634    218263

为了创建文件 3,我首先尝试了此操作,结果生成了一个空文件。

awk 'BEGIN {FS = "\t"; OFS= "\t"} 
 NR==FNR {a[$1]=$2; next}
 { if($1 in a) print $1, a[$1]}' file1 file2 > file3

以下代码确认了问题是数组的索引无法识别;因为添加该else行实际上会将 file2 打印到 file3 中。

awk 'BEGIN {FS = "\t"; OFS= "\t"} 
 NR==FNR {a[$1]=$2; next}
 {if($1 in a) 
      print $1, a[$1]
   else 
      print $1, $2}' file1 file2 > file3

我很纳闷。我想知道是什么原因导致了这个问题以及如何解决它?提前致谢。

答案1

你的评论:

这是输出的第一行90001\r\traw acceleration data$

您的第一个字段是90001\r,不要90001更改FS = "\t"FS = "\r?\t"适应\r输入中的字段,或者添加{ sub(/\r/,"") }或类似于脚本的开头以将其删除。

为什么我的工具输出会覆盖自身以及如何修复它\r有关输入文件中 s(回车符)的更多信息。它们通常位于行尾而不是中线 - 您当前的问题可能是由于前一阶段对字段重新排序或将字符串附加到文件的先前版本中每行的末尾而不是剥离的结果那么s \r

顺便说一句,考虑写:

if($1 in a) 
      print $1, a[$1]
   else 
      print $1, $2

作为一个三元表达式:

print $1, ($1 in a ? a[$1] : $2)

以避免编写大量代码和重复print $1,。还可以考虑改变这一点:

FS = "\t"; OFS= "\t"

对此:

FS=OFS="\t"

出于同样的原因 - 更少的重复和更简洁的代码。

相关内容