如果这样的问题不断被问到我很抱歉,但我在搜索时找不到。
我有两个文件A和B.我需要创建一个文件C,其中包含以下格式的差异:
档案A:
foo1 2.1 3
foo2 3.1 3
foo3 4.1 3
foo4 2.1 3
foo5 3.1 3
档案B:
foo1 2.0 2.9
foo2 2.1 3
foo4 2.1 3
文件C(OUTPUT):LHS包含来自文件A的值.RHS包含来自文件B的值(如果foo不存在,则只包含xxxx)
2.1 3 foo1 2.0 2.9
3.1 3 foo2 2.1 3
4.1 3 foo3 xxxxxxxx
2.1 3 foo4 2.1 3
3.1 3 foo5 xxxxxxxx
答案 0 :(得分:2)
读取这两个文件并将数据存储在由文件的第一个fcolumn值键入的哈希值中。
use strict;
use warnings;
my @files = qw/ FileA.txt FileB.txt /;
my %data;
for my $i (0, 1) {
open my $fh, '<', $files[$i] or die qq(Unable to open "$files[$i]": $!);
while (<$fh>) {
s/\s+$//;
my ($key, $val) = split ' ', $_, 2;
$data{$key}[$i] = $val;
}
}
for my $key (sort keys %data) {
printf "%s %s %s\n",
map $_ // 'xxxxxxxx', $data{$key}[0], $key, $data{$key}[1];
}
<强>输出强>
2.1 3 foo1 2.0 2.9
3.1 3 foo2 2.1 3
4.1 3 foo3 xxxxxxxx
2.1 3 foo4 2.1 3
3.1 3 foo5 xxxxxxxx
答案 1 :(得分:1)
使用awk
的一种方法。保存 fileB 的第一个字段作为哈希的键,其余字段作为其值,并比较 fileA 中的每一行(如果密钥存在),并打印{{1或者哈希的值。
运行下一个命令:
xxxxxxxx
使用以下输出(制表符分隔的字段):
awk '
BEGIN {
OFS = "\t";
}
FNR == NR {
b[ $1 ] = $2 "\t" $3;
next;
}
FNR < NR {
str = ($1 in b) ? b[ $1 ] : "xxxxxxxx";
print $2, $3, $1, str;
}
' fileB fileA
答案 2 :(得分:1)
使用awk
的一种方式:
awk 'FNR==NR { array[$1]=$0; next; } { if ($1 in array) print $2, $3, array[$1]; else print $2, $3, $1, "xxxxxxxx"; }' fileB.txt fileA.txt
分为多行:
FNR==NR {
array[$1]=$0
next
}
{
if ($1 in array) {
print $2, $3, array[$1]
}
else {
print $2, $3, $1, "xxxxxxxx"
}
}
结果:
2.1 3 foo1 2.0 2.9
3.1 3 foo2 2.1 3
4.1 3 foo3 xxxxxxxx
2.1 3 foo4 2.1 3
3.1 3 foo5 xxxxxxxx