首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用awk和grep测试文件中的所有行,如果匹配,将它们放在另一个文件中

用awk和grep测试文件中的所有行,如果匹配,将它们放在另一个文件中
EN

Unix & Linux用户
提问于 2020-04-12 09:52:26
回答 1查看 46关注 0票数 0

这是我的文件test.csv

代码语言:javascript
复制
bonjour|b|french;deutsch|french
hello|h|english;russian|french
gutentag|g|german;polish|french
ciao|i|italian|french

我想测试第三个拆分是否为法语(法语可以在另一个拆分中,所以只有第三个),并将所有与此匹配的行放在另一个文件中。

例子:

代码语言:javascript
复制
bonjour|b|french;deutsch|french

french;deutsch匹配它

有点像awk -F | '$3=="french"' file

EN

回答 1

Unix & Linux用户

发布于 2020-04-12 09:57:07

代码语言:javascript
复制
awk -F '[|;]' '$3 == "french"' file >newfile

这使用|;作为字段分隔符,并在第三个这样的字段和字符串french之间进行字符串比较。如果字符串匹配,则输出行。任何输出都重定向到文件newfile

如果只使用|作为分隔符,则必须在第三个字段开始时使用正则表达式进行测试:

代码语言:javascript
复制
awk -F '|' '$3 ~ /^french;/' file >newfile

这将检测到第三个字段开头的字符串french;,并输出匹配的行。

如果french可以出现在第三个|-delimited字段中的任何地方(例如dutch;french),那么您可能需要稍微放松一下这个模式。

代码语言:javascript
复制
awk -F '|' '$3 ~ /french/' file >newfile

在这里使用grep会有点麻烦,因为很难确切指定要匹配的|-delimited字段:

代码语言:javascript
复制
grep '^\([[:alpha:]]\{1,\}|\)\{2\}french;' file >newfile

这将匹配一个字母字符串(字母),后面是一个|字符(两次),然后是字符串french;

具有扩展正则表达式:

代码语言:javascript
复制
grep -E '^([[:alpha:]]+\|){2}french;' file >newfile

注意,现在需要转义|,而不是将其解释为交替。

同样,如果french可以出现在第三个字段中的任何地方,那么您需要稍微放松一下表达式:

代码语言:javascript
复制
grep '^\([[:alpha:]]\{1,\}|\)\{2\}[^|]*french' file >newfile

或,

代码语言:javascript
复制
grep -E '^([[:alpha:]]+\|){2}[^|]*french' file >newfile

我插入了[^|]*,它匹配单词french (例如,字符串dutch;)之前的任何一段非|字符,并且在单词末尾删除了; (或者您可以用[;|]替换; )。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/579558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档