我有两个制表符分隔的文件,每个文件都有两列。我想创建一个文件,其中包含两个文件的第 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"
出于同样的原因 - 更少的重复和更简洁的代码。