私は以下のような.csvファイルをいくつか持っています。シェルスクリプトで反復を非同期で実行する方法
- [email protected]#-1637746436.csv
- [email protected]#-1637746436.csv
- [email protected]#-1637746439.csv
- [email protected]#-1637746436.csv
-
-
:
[email protected]#-1637746439.csv
私は、タスクの下に実行するスクリプトを書かれています
- スクリプトに引数として渡したパターンに基づいて大きなファイルを取得します。
- 同じパターンを持つ他のすべてのファイルをマージして新しいファイルを作成します。
- 新しいファイルから重複したヘッダーを削除します。
- 引数として渡されたパラメータに基づいて、新しいファイルを移動先に移動します。
例:私は としてスクリプトへの第二引数 "ホーム/ 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
潜在的なクロスサイト重複:https://unix.stackexchange.com/questions/103920/parallelize-a-bash-for-loop – Aserre