多线程shell脚本

时间:2013-09-18 13:23:16

标签: multithreading bash shell unix

任何人都可以帮我编写一个多线程shell脚本

基本上我有两个文件,一个文件包含大约10K行(main_file),另一个文件包含大约200行(sub_file)。这200行包含重复的主文件字符串排序。我正在尝试使用以下命令为每个字符串创建单独的文件到其他文件

我收集了重复到sub_file的字符串。 该字符串随机出现在main_file中。

a=0
while IFS= read -r line
do
a=$(($a+1));
users[$a]=$line
egrep "${line}" $main_file >> $line
done <"$sub_file"

如果我在单线程中使用它需要更多的时间,所以考虑使用多线程进程并在最短的时间内完成该过程..

帮帮我......

2 个答案:

答案 0 :(得分:2)

您需要的工具是gnu parallel

parallel egrep '{}' "$mainfile" '>' '{}' < "$sub_file"

您可以使用选项-P调整处理的作业数量:

parallel -P 4 egrep '{}' "$mainfile" '>' '{}' < "$sub_file"

请参阅manual了解详情。

顺便说一下,为了确保您不处理两行,您可以使输入唯一:

awk '!a[$0]++' "$sub_file" | parallel -P 4 egrep '{}' "$mainfile" '>' '{}'

答案 1 :(得分:0)

注意:从我之前的帖子发帖。这不是直接适用的,但非常类似于调整

我有一个包含以下内容的文件1.txt。

-----cat 1.txt-----
1234
5678
1256
1234
1247

我在文件夹中还有3个文件

-----ls -lrt-------
A1.txt
A2.txt
A3.txt

这三个文件的内容是相似的格式,具有不同的数据值(所有三个文件都是制表符分隔的)

-----cat A1.txt----
A   X   1234    B   1234
A   X   5678    B   1234
A   X   1256    B   1256

-----cat A2.txt----
A   Y   8888    B   1234
A   Y   9999    B   1256
A   X   1234    B   1256

-----cat A3.txt----
A   Y   6798    C   1256

我的目标是搜索所有A1,A2和A3(仅适用于TAB分隔文件的第3列)以获取1.txt中的文本 并且输出必须重定向到match.txt文件,如下所示。

Code:
/home/A1.txt:A   X   1234    B   1234
/home/A1.txt:A   X   5678    B   1234
/home/A1.txt:A   X   1256    B   1256
/home/A2.txt:A   X   1234    B   1256

以下情况应该有效。

cat A*.txt | tr -s '\t' '|' > combined.dat

{ while read myline;do
recset=`echo $myline | cut -f19 -d '|'|tr -d '\r'`
var=$(grep $recset 1.txt|wc -l)
if [[ $var -ne 0 ]]; then
echo $myline >> final.dat 
fi
done } < combined.dat

{ while read myline;do
recset=`echo $myline | cut -f19 -d '|'|tr -d '\r'`
var=$(grep $recset 1.txt|wc -l)
if [[ $var -ne 0 ]]; then
echo $myline >> final2.dat 
fi
done } < combined.dat

使用AWK

awk 'NR==FNR{a[$0]=1}$3 in a{print FILENAME":"$0}' 1.txt A* > matches.txt

用于管道分隔

awk –F’|’ 'NR==FNR{a[$0]=1}$3 in a{print FILENAME":"$0}' 1.txt A* > matches.txt