使用公共列值合并文件

Nyd*_*enn 3 command-line text-processing

awk我想使用命令将文件 1(100 万行)和文件 2(10,000 行)加入到新文件 3(应该是 100 万行)中

文件1:

 471808241 29164840 1 10001 156197396 
 471722917 21067410 1 31001 135961856 
 471941441 20774160 1 7001  180995072 
 471568655 29042630 1 15001 157502996 
 471524711 20716360 1 4001  180226817 
 471873918 29583520 1 2001  128567298 
 471568650 29042631 1 15002 157502910 
Run Code Online (Sandbox Code Playgroud)

文件2

610146 156197396 
531101 135961856 
704011 180226817 
502216 128567298 
707012 180995072 
615246 157502996 
685221 157502910 
Run Code Online (Sandbox Code Playgroud)

期望的输出:

471808241 29164840 1 10001 156197396 610146 
471722917 21067410 1 31001 135961856 531101 
471941441 20774160 1 7001  180995072 707012 
471568655 29042630 1 15001 157502996 615246 
471524711 20716360 1 4001  180226817 704011 
471873918 29583520 1 2001  128567298 502216 
471568650 29042631 1 15002 157502910 685221
Run Code Online (Sandbox Code Playgroud)

Zan*_*nna 5

如果您不介意对可以使用的文件进行排序join(尽管这可能不适合您的情况,但看看如何完成它很有趣)

首先File 2对常用数字字段进行排序

sort -k2 "File 2" > file2clean
Run Code Online (Sandbox Code Playgroud)

然后就可以将这join两个文件

sort -k5 "File 1" | join -a 1 -o 1.1 1.2 1.3 1.4 0 2.1 -1 5 -2 2 - file2clean | tee "File 3"
Run Code Online (Sandbox Code Playgroud)

笔记

  • -a 1File 1打印无法配对的行(因为该文件有更多行,我认为这就是您想要的)
  • -o 1.1 1.2 1.3 1.4 0 2.1输出行的字段顺序 - 我们加入的字段是01.1是第一个文件的第一个字段,依此类推
  • -1 5 -2 2连接第一个文件的第 5 个字段和第二个文件的第 2 个字段
  • - file2clean这里-表示沿着管道传递的标准输入,即排序版本File 1

完成后您可以删除中间的file2clean.