Awk 合并两个文件并将行转换为列
比较两个文件中的第一列。如果匹配,则将同一记录的值从文件2传输到文件1。如果未找到匹配项,请填写“NA” FILE1Awk 合并两个文件并将行转换为列,awk,Awk,比较两个文件中的第一列。如果匹配,则将同一记录的值从文件2传输到文件1。如果未找到匹配项,请填写“NA” FILE1 123 B 124 A 125 N 129 C 134 B 141 T 167 8 179 5 文件2 123 1 1 123 2 1 124 1 3 124 2 3 129 6 1 129 7 1 134 5 1 134 9 1 167 8 2 167 8 2 所需输出 123 B 1 2 1 124 A 1 2 3 125 N NA 129 C 6 7 1 134 B 5
123 B
124 A
125 N
129 C
134 B
141 T
167 8
179 5
文件2
123 1 1
123 2 1
124 1 3
124 2 3
129 6 1
129 7 1
134 5 1
134 9 1
167 8 2
167 8 2
所需输出
123 B 1 2 1
124 A 1 2 3
125 N NA
129 C 6 7 1
134 B 5 9 1
141 T NA
167 8 8 8 2
179 5 NA
我已将此代码用于丢失的记录,但仍然无法在行中查找找到的记录:
awk 'NR==FNR{a[$1]=$2;next;}{print $0 " " ($1 in a ? a[$1] : "NA")}' FILE2 FILE1
123 B 2
124 A 2
125 N NA
129 C 7
134 B 9
141 T NA
167 8 8
179 5 NA
提前感谢根据问题中的当前描述和输入示例,此awk代码适用于:
awk 'NR==FNR{a[$1]=$2 FS $3 FS $4;next}{print $0,($1 in a?a[$1]:"NA")}' <(awk 'NR%2{printf "%s",$1 FS $2 FS;next}{print $2,$3}' FILE2) FILE1
awk'NR==FNR{a[$1]=$2fs$3fs$4;接下来}{print$0,($1在a?a[$1]:“NA”)}'根据问题中的当前描述和输入示例,此awk代码工作:
awk 'NR==FNR{a[$1]=$2 FS $3 FS $4;next}{print $0,($1 in a?a[$1]:"NA")}' <(awk 'NR%2{printf "%s",$1 FS $2 FS;next}{print $2,$3}' FILE2) FILE1
awk'NR==FNR{a[$1]=$2fs$3fs$4;下一步{print$0,($1 in a?a[$1]:“NA”)}'请尝试以下内容
awk '
FNR==NR{
if(++b[$1]==1){
a[$1]=$2
}
else{
a[$1]=a[$1] OFS $2 OFS $3
}
next
}
($1 in a){
print $1,$2,a[$1]
next
}
{
print $0,"NA"
}' Input_file2 Input_file1
输出如下
123 B 1 2 1
124 A 1 2 3
125 N NA
129 C 6 7 1
134 B 5 9 1
141 T NA
167 8 8 8 2
179 5 NA
你能试试下面的吗
awk '
FNR==NR{
if(++b[$1]==1){
a[$1]=$2
}
else{
a[$1]=a[$1] OFS $2 OFS $3
}
next
}
($1 in a){
print $1,$2,a[$1]
next
}
{
print $0,"NA"
}' Input_file2 Input_file1
输出如下
123 B 1 2 1
124 A 1 2 3
125 N NA
129 C 6 7 1
134 B 5 9 1
141 T NA
167 8 8 8 2
179 5 NA
我假设您希望收集file2第2列的列表,但只保留file2第3列的最后一个值
这里有一点perl:
perl -lane '
if ($. == ++$nr) {
$x{$F[0]} = $F[1];
} else {
push @{ $y{$F[0]} }, $F[1];
$z{$F[0]} = $F[2];
}
close ARGV if eof; # reset $. for new file
END {
for $key (sort keys %x) {
printf "%s %s %s\n", $key, $x{$key},
(exists $y{$key} ? join(" ", @{$y{$key}}, $z{$key}) : "NA");
}
}
' file 1 file2
作为awk
gawk '
NR == FNR {
x[$1] = $2
next
}
{
y[$1] = y[$1] $2 OFS
z[$1] = $3
}
END {
PROCINFO["sorted_in"] = "@ind_num_asc"
for (key in x) {
printf "%s %s %s\n", key, x[key], (key in y ? y[key] z[key] : "NA")
}
}
' file{1,2}
这将GNU awk仅用于PROCINFO
变量。如果您不需要此依赖项,只需删除该行并将输出导入|sort-k1,1n
我假设您希望收集file2第2列的列表,但只保留file2第3列的最后一个值
这里有一点perl:
perl -lane '
if ($. == ++$nr) {
$x{$F[0]} = $F[1];
} else {
push @{ $y{$F[0]} }, $F[1];
$z{$F[0]} = $F[2];
}
close ARGV if eof; # reset $. for new file
END {
for $key (sort keys %x) {
printf "%s %s %s\n", $key, $x{$key},
(exists $y{$key} ? join(" ", @{$y{$key}}, $z{$key}) : "NA");
}
}
' file 1 file2
作为awk
gawk '
NR == FNR {
x[$1] = $2
next
}
{
y[$1] = y[$1] $2 OFS
z[$1] = $3
}
END {
PROCINFO["sorted_in"] = "@ind_num_asc"
for (key in x) {
printf "%s %s %s\n", key, x[key], (key in y ? y[key] z[key] : "NA")
}
}
' file{1,2}
这将GNU awk仅用于PROCINFO
变量。如果您不想要此依赖项,只需删除该行并将输出导入| sort-k1,1n
请解释如何获取预期输出的第三列。请解释如何获取预期输出的第三列。您好,格伦,你能用awk做同样的事情吗?你发表评论时我正在翻译。你好,格伦,你能用awk做同样的事情吗?你发表评论时我正在翻译。你好,肯特,谢谢你的代码。你能解释一下这部分代码吗@OXXO您将看到它通过执行Hi Kent中的awk one liner来做什么,谢谢您的代码。你能解释一下这部分代码吗@OXXO通过在