Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 对大量数据进行灰色化的不同方法_Bash_Grep - Fatal编程技术网

Bash 对大量数据进行灰色化的不同方法

Bash 对大量数据进行灰色化的不同方法,bash,grep,Bash,Grep,所以我有一个Huuuge文件和一个大的项目列表,我想从该文件中删除。 在本例中,让文件这样表示- seq 1 10000 > file.txt #file.txt contains numbers from 1 to 10000 seq 1 5 10000 > list #list contains every fifth number from 1 to 10000 我的问题是,从“file.txt”中grep出与“list”对应的行的最佳

所以我有一个Huuuge文件和一个大的项目列表,我想从该文件中删除。 在本例中,让文件这样表示-

seq 1 10000 > file.txt          #file.txt contains numbers from 1 to 10000
seq 1 5 10000 > list            #list contains every fifth number from 1 to 10000
我的问题是,从“file.txt”中grep出与“list”对应的行的最佳方法是什么

我试了两种方法-

time while read i ; do grep -w "$i" file.txt ; done < list > output
这一次比较慢,打卡速度为-real 0m1.402s


有更好(更快)的方法吗?我错过了一个最好的方法吗?

快一点还是不快一点,你在上面已经无用地使用了
cat
为什么不呢

或者使用更定制的awk

awk 'NR==FNR{a[$1];next} $1 in a{print $1;next}' list file.txt

不管你快不快,你都不能在上面使用
cat
为什么不呢

或者使用更定制的awk

awk 'NR==FNR{a[$1];next} $1 in a{print $1;next}' list file.txt

您可以尝试
awk

awk 'NR==FNR{a[$1];next} $1 in a' file.txt list
在我的系统中,使用样本数据,
awk
grep
更快

测试:

$ time grep -f file.txt list > out

real    0m1.231s
user    0m1.056s
sys     0m0.175s

$ time awk 'NR==FNR{a[$1];next} $1 in a' file.txt list > out1

real    0m0.068s
user    0m0.067s
sys     0m0.001s

您可以尝试
awk

awk 'NR==FNR{a[$1];next} $1 in a' file.txt list
在我的系统中,使用样本数据,
awk
grep
更快

测试:

$ time grep -f file.txt list > out

real    0m1.231s
user    0m1.056s
sys     0m0.175s

$ time awk 'NR==FNR{a[$1];next} $1 in a' file.txt list > out1

real    0m0.068s
user    0m0.067s
sys     0m0.001s

你在比较苹果和桔子

此命令从file.txt中的列表中对单词进行greps

time for i in `cat list`; do grep -w "$i" file.txt ; done > output
此命令从列表中的file.txt中greps模式

time grep -f file.txt list > output
您需要将一个文件固定为要匹配的字符串的源文件,将另一个文件固定为要匹配字符串的目标数据-还需要使用相同的grep选项,如-w或-F

听起来好像list是patterns的来源,file.txt是target datafile-这里是我对原始调整命令加上一个awk和两个sed解决方案的计时-sed解决方案的不同之处在于,模式是作为单独的sed命令给出的,还是作为一个扩展正则表达式给出的

时间安排

one grep
real    0m0.016s
user    0m0.001s
sys     0m0.001s
2000 output1

loop grep
real    0m10.120s
user    0m0.060s
sys     0m0.212s
2000 output2

awk
real    0m0.022s
user    0m0.007s
sys     0m0.000s
2000 output3

sed
real    0m4.260s
user    0m4.211s
sys     0m0.022s
2000 output4

sed -r
real    0m0.144s
user    0m0.085s
sys     0m0.047s
2000 output5
剧本

n=10000
seq 1 $n >file.txt             
seq 1 5 $n >list               

echo "one grep"
time grep -Fw -f list file.txt > output1
wc -l output1

echo "loop grep"
time for i in `cat list`; do grep -Fw "$i" file.txt ; done > output2
wc -l output2

echo "awk"
time awk 'ARGIND==1 {list[$1]; next} $1 in list' list file.txt >output3
wc -l output3

echo "sed"
sed 's/^/\/^/;s/$/$\/p/' list >list.sed
time sed -n -f list.sed file.txt >output4
wc -l output4

echo "sed -r"
tr '\n' '|' <list|sed 's/^/\/^(/;s/|$/)$\/p/' >list.sedr
time sed -nr -f list.sedr file.txt >output5
wc -l output5
n=10000
seq 1$n>file.txt
序号15$n>列表
回应“一个grep”
时间grep-Fw-f list file.txt>output1
wc-l输出1
回声“循环grep”
《猫的名单》中的我的时间到了;do grep-Fw“$i”file.txt;完成>输出2
wc-l输出2
回声“awk”
时间awk'ARGIND==1{list[$1];下一个}$1在list'list file.txt>output3中
wc-l输出3
回声“sed”
sed的/^/\/^/;s/$/$\/p/'list>list.sed
时间sed-n-f list.sed file.txt>output4
wc-l输出4
回声“sed-r”
tr'\n'|'list.sedr
时间sed-nr-f list.sedr file.txt>output5
wc-l输出5

你在比较苹果和橙子

此命令从file.txt中的列表中对单词进行greps

time for i in `cat list`; do grep -w "$i" file.txt ; done > output
此命令从列表中的file.txt中greps模式

time grep -f file.txt list > output
您需要将一个文件固定为要匹配的字符串的源文件,将另一个文件固定为要匹配字符串的目标数据-还需要使用相同的grep选项,如-w或-F

听起来好像list是patterns的来源,file.txt是target datafile-这里是我对原始调整命令加上一个awk和两个sed解决方案的计时-sed解决方案的不同之处在于,模式是作为单独的sed命令给出的,还是作为一个扩展正则表达式给出的

时间安排

one grep
real    0m0.016s
user    0m0.001s
sys     0m0.001s
2000 output1

loop grep
real    0m10.120s
user    0m0.060s
sys     0m0.212s
2000 output2

awk
real    0m0.022s
user    0m0.007s
sys     0m0.000s
2000 output3

sed
real    0m4.260s
user    0m4.211s
sys     0m0.022s
2000 output4

sed -r
real    0m0.144s
user    0m0.085s
sys     0m0.047s
2000 output5
剧本

n=10000
seq 1 $n >file.txt             
seq 1 5 $n >list               

echo "one grep"
time grep -Fw -f list file.txt > output1
wc -l output1

echo "loop grep"
time for i in `cat list`; do grep -Fw "$i" file.txt ; done > output2
wc -l output2

echo "awk"
time awk 'ARGIND==1 {list[$1]; next} $1 in list' list file.txt >output3
wc -l output3

echo "sed"
sed 's/^/\/^/;s/$/$\/p/' list >list.sed
time sed -n -f list.sed file.txt >output4
wc -l output4

echo "sed -r"
tr '\n' '|' <list|sed 's/^/\/^(/;s/|$/)$\/p/' >list.sedr
time sed -nr -f list.sedr file.txt >output5
wc -l output5
n=10000
seq 1$n>file.txt
序号15$n>列表
回应“一个grep”
时间grep-Fw-f list file.txt>output1
wc-l输出1
回声“循环grep”
《猫的名单》中的我的时间到了;do grep-Fw“$i”file.txt;完成>输出2
wc-l输出2
回声“awk”
时间awk'ARGIND==1{list[$1];下一个}$1在list'list file.txt>output3中
wc-l输出3
回声“sed”
sed的/^/\/^/;s/$/$\/p/'list>list.sed
时间sed-n-f list.sed file.txt>output4
wc-l输出4
回声“sed-r”
tr'\n'|'list.sedr
时间sed-nr-f list.sedr file.txt>output5
wc-l输出5


我不知道你为什么被否决,这是正确的,并且使得OP的测量结果不正确
-f
指定模式源而不是输入,因此在第一种情况下,OP在100000 tokens文件中搜索20000 tokens,而在另一种情况下,他在20000 tokens文件中搜索100000 tokens。谢谢Aaron-我犹豫了一下是否给出“权利”命令行由于问题实际上是问题中的一个或多个拼写错误,但很难确定在何处,请随意将其包含在您的答案中。Aaron-拼写错误今天早上会传染-您可能想要seq 15 100000>patternsWoops,对吧!现在,对于拥有100000个代币的ideone来说,它花费的时间太长了,我已经将其更改为10000,并且惊讶地看到它支持第一种选择。也许我在什么地方又犯了一个错误?我不知道你为什么被否决,这是正确的,使得OP的测量结果不正确
-f
指定模式源而不是输入,因此在第一种情况下,OP在100000 tokens文件中搜索20000 tokens,而在另一种情况下,他在20000 tokens文件中搜索100000 tokens。谢谢Aaron-我犹豫了一下是否给出“权利”命令行由于问题实际上是问题中的一个或多个拼写错误,但很难确定在何处,请随意将其包含在您的答案中。Aaron-拼写错误今天早上会传染-您可能想要seq 15 100000>patternsWoops,对吧!现在,对于拥有100000个代币的ideone来说,它花费的时间太长了,我已经将其更改为10000,并且惊讶地看到它支持第一种选择。也许我在什么地方又犯了一个错误?
cat
的这种用法比无用还要糟糕;如果
file.txt
中有除换行符以外的空格,则不正确。我认为您的
grep
上也需要
-w
。而且
-F
@chepner,我把那只猫修好了。谢谢你指出!也许从现在起我会记得。这种使用猫的方式比没用还糟糕;如果
file.txt
中有除换行符以外的空格,则不正确。我认为您的
grep
上也需要
-w
。而且
-F
@chepner,我把那只猫修好了。谢谢你指出!也许我会记得从现在开始。感谢stats++,但是为什么你要为每个
a[$1]
自动分配到零nop的值分配1呢?@sjsam,你是对的。我忘了它将初始化为零。谢谢。awk似乎比grep快多了。我的问题是,它甚至可以用于文本匹配吗?或者这是数字匹配的一个特例<代码>a[$1]<