任何人都可以帮我编写一个多线程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"
如果我在单线程中使用它需要更多的时间,所以考虑使用多线程进程并在最短的时间内完成该过程..
帮帮我......
答案 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