一尘不染

在Unix上的文本文件中联接多个字段

linux

我该怎么做?

File1 看起来像这样:

foo 1 scaf 3 
bar 2 scaf 3.3

File2 看起来像这样:

foo 1 scaf 4.5
foo 1 boo 2.3
bar 2 scaf 1.00

我想做的是找到 字段 1,2和3 相同时在 File1File2 中同时出现的行。 __

有办法吗?


阅读 218

收藏
2020-06-03

共1个答案

一尘不染

你可以试试看

awk '{
 o1=$1;o2=$2;o3=$3
 $1=$2=$3="";gsub(" +","")
 _[o1 FS o2 FS o3]=_[o1 FS o2 FS o3] FS $0
}
END{ for(i in _) print i,_[i] }' file1 file2

输出

$ ./shell.sh
foo 1 scaf  3 4.5
bar 2 scaf  3.3 1.00
foo 1 boo  2.3

如果要省略不常见的行

awk 'FNR==NR{
 s=""
 for(i=4;i<=NF;i++){ s=s FS $i }
 _[$1$2$3] = s
 next
}
{
  printf $1 FS $2 FS $3 FS
  for(o=4;o<NF;o++){
   printf $i" "
  }
  printf $NF FS _[$1$2$3]"\n"
 } ' file2 file1

输出

$ ./shell.sh
foo 1 scaf 3  4.5
bar 2 scaf 3.3  1.00
2020-06-03