追加読書

追加読書

次のコマンドを使用して、ファイル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

これら2つのファイルを結合したいと思います。

joinしたがって、ファイルをキー順に並べ替えてから、次のコマンドを使用します。

sort -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残りのコードをスキップするfile2ために、行のキーと値のペアを保存します。next
  • sub(" ?$"," "a[$5])行末のオプションのスペースをa5 番目の列をキーとして配列のスペースと値に置き換えるには、置換を使用します。
  • 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

関連情報