Awk 将一个文件的第一列与第二个文件的所有列进行比较

Awk 将一个文件的第一列与第二个文件的所有列进行比较,awk,sed,Awk,Sed,我想将一个文件的第一列与第二个文件的所有列进行比较,如果找到匹配项,则打印第一列(第一个文件)和第二个文件中找到匹配项的完整行 示例输入文件_1 RAM_1 RAM_2 RAM_3 RAM_4 RAM_5 RAM_6 示例输入文件_2 RAM_7 RAM_3 RAM_8 RAM_10 RAM_15 RAM_2 RAM_6 RAM_16 RAM_4 RAM_11 RAM_5 RAM_18 RAM_20 RAM_19 RAM_1 RAM_8 RAM_9 RAM_12 预期产量 RAM_1 RA

我想将一个文件的第一列与第二个文件的所有列进行比较,如果找到匹配项,则打印第一列(第一个文件)和第二个文件中找到匹配项的完整行

示例输入文件_1

RAM_1
RAM_2
RAM_3
RAM_4
RAM_5
RAM_6
示例输入文件_2

RAM_7 RAM_3
RAM_8 RAM_10 RAM_15 RAM_2
RAM_6 RAM_16 RAM_4
RAM_11 RAM_5 RAM_18 RAM_20 RAM_19
RAM_1 RAM_8 RAM_9 RAM_12
预期产量

RAM_1  RAM_1 RAM_8 RAM_9 RAM_12
RAM_2  RAM_8 RAM_10 RAM_15 RAM_2
RAM_3  RAM_7 RAM_3
RAM_4  RAM_6 RAM_16 RAM_4
RAM_5  RAM_11 RAM_5 RAM_18 RAM_20 RAM_19
RAM_6  RAM_6 RAM_16 RAM_4
我已经尝试了固定的列数,但它只打印文件的第一行

 awk 'NR==FNR{a[$1]=$0} $1 in a && $2 in a && $3 in a{print a[$1] ORS a[$2] ORS a[$3]}' file_2 file_1

请您尝试以下内容,仅基于显示的样本,使用GNU
awk
编写

awk '
FNR==NR{
  a[$0]=$0
  next
}
{
  for(i=1;i<=NF;i++){
    if($i in a){
      print a[$i],$0 | "sort -k1"
    }
  }
}' file1  file2
awk'
FNR==NR{
a[$0]=$0
下一个
}
{

对于(i=1;i另一种方法,假设单词边界足以避免部分匹配,并且要匹配的文本没有regex元字符:

$ awk 'NR==FNR{a[$0]; next} {for(k in a) if(k ~ "\\<"$1"\\>") print $0, k}' f2 f1
RAM_1 RAM_1 RAM_8 RAM_9 RAM_12
RAM_2 RAM_8 RAM_10 RAM_15 RAM_2
RAM_3 RAM_7 RAM_3
RAM_4 RAM_6 RAM_16 RAM_4
RAM_5 RAM_11 RAM_5 RAM_18 RAM_20 RAM_19
RAM_6 RAM_6 RAM_16 RAM_4
$awk'NR==FNR{a[$0];next}{for(a中的k)如果(k~“\\”)打印$0,k}'f2 f1
RAM_1 RAM_1 RAM_8 RAM_9 RAM_12
RAM_2 RAM_8 RAM_10 RAM_15 RAM_2
RAM_3 RAM_7 RAM_3
RAM_4 RAM_6 RAM_16 RAM_4
RAM_5 RAM_11 RAM_5 RAM_18 RAM_20 RAM_19
RAM_6 RAM_6 RAM_16 RAM_4
这可能适合您(GNU-sed):

sed-E'1{x;s/^/cat file2/E;x};G;s/^(\s+)(\n.*)\n([^\n]*\[^\n]*)./\1\3/;P;d'file1
file1
的开头,将
file2
复制到保留空间中

对于
file1
中的每一行,追加
file2
,并使用模式匹配和反向引用,生成一行,其中包含
file1
中的第一列以及
file2
中的匹配行,或者只打印原始行

$ awk 'NR==FNR{a[$0]; next} {for(k in a) if(k ~ "\\<"$1"\\>") print $0, k}' f2 f1
RAM_1 RAM_1 RAM_8 RAM_9 RAM_12
RAM_2 RAM_8 RAM_10 RAM_15 RAM_2
RAM_3 RAM_7 RAM_3
RAM_4 RAM_6 RAM_16 RAM_4
RAM_5 RAM_11 RAM_5 RAM_18 RAM_20 RAM_19
RAM_6 RAM_6 RAM_16 RAM_4
sed -E '1{x;s/^/cat file2/e;x};G;s/^(\S+)(\n.*)*\n([^\n]*\<\1\>[^\n]*).*/\1 \3/;P;d' file1