[英]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.