Awk 合并两个文件并将行转换为列

Awk 合并两个文件并将行转换为列,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

比较两个文件中的第一列。如果匹配,则将同一记录的值从文件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 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通过在