awk 複数のファイルからシーケンスごとに行を 1 つのファイルにマージする

awk 複数のファイルからシーケンスごとに行を 1 つのファイルにマージする

たくさんのファイルがあり、3 つのファイルごとにそれらの間の文字列を結合する必要があります。各ファイルには約 100 ~ 500 行あり、結果のファイルは約 100 ~ 200 MB になります。

ppc キーワード ジェネレーターも同じことを行いますが、非常に遅く、キーワードが 100 万個になると、1 つの結果ファイルに 2 ~ 3 時間かかります。

1 1 1

Acapella Audio Arts
Acoustic Smart

2 番目

australian
Australia
America

f3

Round Grille
Square Grille
grille
defence grille

結果

Acapella Audio Arts australian Round Grille
Acapella Audio Arts australian Square Grille
Acapella Audio Arts australian grille
Acapella Audio Arts australian defence grille
Acapella Audio Arts Australia Round Grille
Acapella Audio Arts Australia Square Grille
Acapella Audio Arts Australia grille
Acapella Audio Arts Australia defence grille
Acapella Audio Arts America Round Grille
Acapella Audio Arts America Square Grille
Acapella Audio Arts America grille
Acapella Audio Arts America defence grille
Acoustic Smart australian Round Grille
Acoustic Smart australian Square Grille
Acoustic Smart australianе grille
Acoustic Smart australian defence grille
Acoustic Smart Australia Round Grille
Acoustic Smart Australia Square Grille
Acoustic Smart Australia grille
Acoustic Smart Australia defence grille
Acoustic Smart America Round Grille
Acoustic Smart America Square Grille
Acoustic Smart America grille
Acoustic Smart America defence grille 
etc.....

答え1

bash のみ:

while IFS= read -u3 -r product; do
    while IFS= read -u4 -r region; do
        while IFS= read -u5 -r option; do
            echo "$product $region $option"
        done 5<f3
    done 4<f2
done 3<f1

このバージョンではファイルI/Oが少なくなるため(各ファイルを1回だけ読み込む)、より高速になる可能性があります。

mapfile -t products < f1
mapfile -t regions  < f2
mapfile -t options  < f3
for product in "${products[@]}"; do 
    for region in "${regions[@]}"; do
        for option in "${options[@]}"; do
            echo "$product $region $option"
        done
    done
done

関連情報