2017-07-18 25 views
0

私は以下のような.csvファイルをいくつか持っています。シェルスクリプトで反復を非同期で実行する方法

  1. [email protected]#-1637746436.csv
  2. [email protected]#-1637746436.csv
  3. [email protected]#-1637746439.csv
  4. [email protected]#-1637746436.csv
    1. [email protected]#-1637746439.csv

    私は、タスクの下に実行するスクリプトを書かれています

  5. スクリプトに引数として渡したパターンに基づいて大きなファイルを取得します。
  6. 同じパターンを持つ他のすべてのファイルをマージして新しいファイルを作成します。
  7. 新しいファイルから重複したヘッダーを削除します。
  8. 引数として渡されたパラメータに基づいて、新しいファイルを移動先に移動します。

例:私は としてスクリプトへの第二引数 "ホーム/ DEST2 @ホーム/ dest1,1637746436 @ 1637746436" を渡しています。スクリプトの下に パターン(1637746436)が取得されます。大きなファイルを取得し、他のすべてのファイル(同じパターンを持つ)をそのファイルにマージします。新しいファイルが作成され、同じファイルがコピー先(home/dest1)に移動されます。

以下のスクリプトは、パターンマッチングと実行を順番に実行します。

'forループ反復'をどのように並列に実行する必要がありますか? "1637746436 @ home/dest1,1637746436 @ home/dest2"のパターンマッチングは、同時に実行する必要があります。

助けてください。クリーンは、その後、終了するバックグラウンドのために(子)プロセスを待って、ループの内部機能を作成し、バックグラウンド(子プロセス)でそれを入れて、ループ内で関数を呼び出すことであろう

$merge.sh /home/dummy/17 "[email protected]/dest1,[email protected]/dest2" 


#!/bin/bash 
current=`pwd` 
source=$1 
destination=$2 
echo "$destination" | tr "," "\n" > $current/out.txt 
cat out.txt | cut -d "@" -f1 > $current/pattern.txt 

for var in `cat pattern.txt` 
do 
getBiggerfile=$(ls -Sl $source/*$var.csv | head -1) 
cd $source 
getFileName=$(echo $getBiggerfile | cut -d " " -f9-) 
newFileName=$(echo $getFileName | cut -d "@" -f1) 
cat *$var.csv >> $getFileName 
header=$(head -n 1 $getFileName) 
(printf "%s\n" "$header"; 
grep -vFxe "$header" $getFileName 
) > $newFileName.csv 
rm -rf *$var.csv 
cd $current 

for var1 in `cat out.txt` 
do 
target=`echo $var1 | cut -d "@" -f2` 
id=$(echo $var1 | cut -c-10) 
if [ $id = $var ] 
then 
mv $newFileName.csv $target 
fi 
done 
done 
+1

潜在的なクロスサイト重複:https://unix.stackexchange.com/questions/103920/parallelize-a-bash-for-loop – Aserre

答えて

1

function do_the_thing(){ 
    source="$1" 
    current="$2" 
    var="$3" 
    getBiggerfile=$(ls -Sl $source/*$var.csv | head -1) 
    cd $source 
    getFileName=$(echo $getBiggerfile | cut -d " " -f9-) 
    newFileName=$(echo $getFileName | cut -d "@" -f1) 
    cat *$var.csv >> $getFileName 
    header=$(head -n 1 $getFileName) 
    (printf "%s\n" "$header"; 
     grep -vFxe "$header" $getFileName 
    ) > $newFileName.csv 
    rm -rf *$var.csv 
    cd $current 

    for var1 in `cat out.txt` 
    do 
     target=`echo $var1 | cut -d "@" -f2` 
     id=$(echo $var1 | cut -c-10) 
     if [ $id = $var ] 
     then 
      mv $newFileName.csv $target 
     fi 
    done 
} 

for var in `cat pattern.txt` 
do 
    do_the_thing "$source" "$current" "$var" & 
done 

wait 
+0

@ジャック - あなたの助けのおかげ。私は上記のアプローチを試み、それは私のために働いた。 – Sampath

関連する問題