繁体   English   中英

使用单行reg exp grep / sed从csv文件中删除不包含字符串的行

[英]Removing rows that don't contain strings from csv file, using one-line reg exp grep/sed

我有idsfile.csv ,它是一个用逗号分隔的ID文件(其中没有换行符),我只想从第二个datafile.txt文件中抓取其中一个ID(由制表符包围)的行。 。

样本idsfile.csv:

000001,000002,000005,000007,000008,000009,000011,000021,000029,000040,...

样本datafile.txt:

titl e1   000001   description1 
title2   000003   descr iption2 
ti tle3   000021   des cripti on3 
title4   000023   description4 

如果我这样做而不必从文件中读取ID,则可以尝试:

grep -Ev '/\t000001\t|\t000002\t|\t000003\t/' datafile.txt > output.txt

但是我不确定如何以逗号分隔的值的形式读取它们,然后在正则表达式中使用它们。

有谁知道我如何将其汇编为一个单行命令查询? 也许使用textscan?

编辑:实际上,如果我将idsfile.csv更改为每行都有一个id(在前后都有一个选项卡),那么我是否可以将行与此项工作类似,或者,我希望语法很错误:

grep -Evf idsfile.csv datafile.txt > output.txt

使用sed将idsfile.csv的内容转换为与grep一起使用的正则表达式。

idsfile.csv中的单行数据对此工作流不利-您将不得不将其转换为一系列行。 Unix工具集基于各行!

因此,我们需要将逗号音译为换行符:

tr , '\012' < idsfile.csv > idsfile.lines
fgrep -f idsfile.lines datafile.txt

符合POSIX的“ grep”还将识别:

grep -F -f idsfile.lines datafile.txt

您甚至可以摆脱:

tr , '\012' < idsfile.csv |
grep -F -f - datafile.txt

这告诉'grep'从其标准输入中读取要搜索的名称列表。

最后,如果您使用的是GNU grep,则可以添加“ -w ”来搜索单词-它将要求模式用非字母数字字符(示例中的空格)包围。 ' -w'选项表示如果datatfile.txt中的一行包含

something 000002100  kkkk

条目'000021'将不会选择该行(如果没有' -w ',则会被选择)。

以下1-liner使用awk将csv文件的每个字段转换为正则表达式列表,以便grep通过-f选项进行匹配。 然后,我们使用Bash的进程替换语法<( )awk命令的输出视为文件(命名管道)。

$ grep -w -f <(awk -v 'RS=,|\n' '{print "\t"$0"\t"}' sample.csv) title.txt

输入

$ cat sample.csv
000001,000003,000005,000007,000008,000009,000011,000023,000029

$ cat title.txt
titl e1 000001  description1
title2  000003  descr iption2
ti tle3 000021  des cripti on3
title4  000023  description4

产量

$ grep -w -f <(awk -v 'RS=,|\n' '{print "\t"$0"\t"}' sample.csv) title.txt
titl e1 000001  description1
title2  000003  descr iption2
title4  000023  description4

请注意 ,包含000021的行不匹配。 同样不明显的是title.txt中的每个6位数字都用制表符而不是空格包围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM