Awk 以空格为变量的Grep精确匹配字符串

Awk 以空格为变量的Grep精确匹配字符串,awk,grep,Awk,Grep,我有: 其中包含 file.csv 当我这样做时: grep“带空格的字符串”file.csv 它产生所需的结果,即: 2,1,"string with spaces",3,4,5 2,1,"some other string",3,4,5 2,1,"string with spaces more than this",3,4,5 2,1,"yet another",3,4,5 2,1,"string with spaces too",3,4,5 现在我需要在while循环中执行此操作: 2

我有:

其中包含

file.csv
当我这样做时:

grep“带空格的字符串”file.csv

它产生所需的结果,即:

2,1,"string with spaces",3,4,5
2,1,"some other string",3,4,5
2,1,"string with spaces more than this",3,4,5
2,1,"yet another",3,4,5
2,1,"string with spaces too",3,4,5
现在我需要在while循环中执行此操作:

2,1,"string with spaces",3,4,5
包含:

list.txt
我想要的结果是:

string with spaces
yet another
问题是while循环返回为空,或者部分匹配。如何在list.txt中循环并获得所需的输出?

如果您对awk没有问题,这应该是一个简单的问题

2,1,"string with spaces",3,4,5
2,1,"yet another",3,4,5
ORas根据Ed sir的评论,将字段分隔符改为逗号并使其更清晰,可以尝试以下操作

awk 'FNR==NR{a[$0];next} ($4 in a)' list.txt FS="[,\"]" file.csv
输出如下

awk -F, 'FNR==NR{a["\""$0"\""];next} $3 in a' list.txt file.csv
如果你同意awk,这应该是一个简单的

2,1,"string with spaces",3,4,5
2,1,"yet another",3,4,5
ORas根据Ed sir的评论,将字段分隔符改为逗号并使其更清晰,可以尝试以下操作

awk 'FNR==NR{a[$0];next} ($4 in a)' list.txt FS="[,\"]" file.csv
输出如下

awk -F, 'FNR==NR{a["\""$0"\""];next} $3 in a' list.txt file.csv

您的字符串引用都使用单引号,它不会对$p变量进行任何插值。将其更改为grep“$p”,“file.csv”将解决此问题。关键是这里的变量插值在双引号内完成,然后与包含实际双引号字符的字符串连接


根据您的观点,可读版本大致如下所示:grep\$p\,file.csv

您的字符串引用都使用单引号,它不会对$p变量进行任何插值。将其更改为grep“$p”,“file.csv”将解决此问题。关键是这里的变量插值在双引号内完成,然后与包含实际双引号字符的字符串连接

根据您的观点,可读版本大致如下:grep\$p\,file.csv

这应该让你走得够远了


这会让你走得更远。

这很好。我喜欢grep\$p\,file.csv版本,因为它更具可读性。这非常好用。我喜欢grep\$p\,file.csv版本,因为它更具可读性。它应该是awk-F,'FNR==NR{a[\$0\];'list.txt file.csv中的next}$3。为了避免在引用字段包含逗号时出错,实际上您需要使用FPAT或其他方法,例如使用match$0,/[^]*/使其健壮,即使进行了更改,我建议如果引用的字段包含逗号,它仍然会失败。这不值得,因为OP已经接受了不同的答案。@EdMorton我在接受@marcus的答案时出错了。我去实施他的解决方案&它奏效了。但是,my list.txt有27k行,file.csv有1000k行。格雷普走得非常慢。我回到这里,发现你的答案是@ravindersingh13加在他的答案上的。你的工作时间不到5秒。我不明白awk是如何工作的,但是我用grep解决的问题可能需要几天的时间。好的,请参阅,了解有关使用shell循环操作文本的一些问题,包括您刚刚发现的效率。要了解在UNIX中处理文本文件的每个人都应该获得Arnold Robbins的《有效的awk编程》,第四版。它应该是awk-F,'FNR==NR{a[\$0\];'list.txt file.csv中的next}$3,以避免在引用字段包含逗号时出错,实际上需要使用FPAT或其他方法,例如匹配$0/[^]*/为了使它更健壮,即使进行了更改,我建议如果引用的字段包含逗号,它仍然会失败。这不值得,因为OP已经接受了不同的答案。@EdMorton我在接受@marcus的答案时出错。我去实现他的解决方案,它成功了。但是,我的list.txt有27k行,而file.csv有1000k行.grep的速度太慢了。我回到这里,找到了@ravindersingh13添加到他的答案中的你的答案。你的答案在不到5秒钟的时间内就完成了。我不明白awk是如何工作的,但我与grep的解决方案可能需要几天时间。好的,请参阅有关使用shell循环来处理文本的一些问题,包括在迪斯科时的效率vered.要学习在UNIX中处理文本文件的每个人都应该学习Arnold Robbins的《有效的awk编程》,第四版。通过循环反复调用grep来完成这项工作效率极低,您可以在一次调用awk中完成这项工作。通过循环反复调用grep来完成这项工作效率极低,您可以通过我会打一个电话给awk。