次のコマンドを使用して、ファイル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
追加読書
- 「ユーティリティ:参加」。 シェルコマンド言語。単一のUNIX仕様。問題7. IEEE 1003.1。 2016. グループを開きます。
答え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])
行末のオプションのスペースをa
5 番目の列をキーとして配列のスペースと値に置き換えるには、置換を使用します。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