进一步阅读

进一步阅读

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

文件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 

文件2

610146 156197396 
531101 135961856 
704011 180226817 
502216 128567298 
707012 180995072 
615246 157502996 
685221 157502910 

期望的输出:

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

答案1

我想加入这两个文件

join因此,将文件按键顺序排序后使用命令:

排序 -b -k 5 文件 1 > 排序文件 1
排序 -b -k 2 文件 2 > 排序文件 2
join -1 5 -2 2 -o 1.1,1.2,1.3,1.4,2.2,2.1 排序文件1 排序文件2

进一步阅读

答案2

$ awk 'NR==FNR{a[$2]=$1; next} {sub(" ?$"," "a[$5]); print}' file2 file1
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
  • NR==FNR如果当前行号与文件行号相同,则仅适用于第一个文件参数file2
  • a[$2]=$1; next从行中保存键值对file2next用于跳过其余代码
  • sub(" ?$"," "a[$5])使用替换将行尾的可选空格替换为a基于第五列作为键的数组中的空格和值
  • print然后打印修改后的输入行file1

答案3

从 10,000 个键中进行一百万次查找,如果需要性能,请使用 perl:

#!/usr/bin/perl

# create hash from file2
($f2) = pop @ARGV;
%hash = map { reverse split } do { local @ARGV=($f2); <>};

# loop over file1 
while ( <> ) {
   chomp;
   @F = split;
   print "$_ $hash{$F[4]}\n";
}

答案4

珀尔

perl -lpe '
   BEGIN{ %h = do{local(@ARGV,$/)=pop;<>} =~ s/^(\s*\d+)(\s\d+)$/$2 $1/mgr =~ //mg;
   $_ .= $h{(/(\s\d+)$/)[0]};
' File1 File2

重击

while read -r value key; do eval "_h_$key='$value';"; done < File2
while read -r _1 _2 _3 _4 _5; do
   eval "x=\$_h_$_5"
   printf '%s ' "$_1" "$_2" "$_3" "$_4" "$_5"
   echo "$x"
done < File1

塞德

echo '.' >> File2
sed -e '
   1{
      :file2
         N
      /\n\.$/!bfile2
      H;d
   }
   G
   s/\([ ][0-9][0-9]*\)\n.*\n\([0-9][0-9]*\)\1\n.*/\1 \2/
' File2 File1

相关内容