我想过滤掉恰好有4个分号的行。
不应处理或多或少的分号。我正在使用regex / grep:
积极的例子:
VES_I.MG;A;97;13;1
负面例子:
VES_I.MG;A;97;13;1;2
答案 0 :(得分:3)
对于这个直截了当的事情,我实际上只是建议根据该数字向量计算分号和子集。
快速执行此操作的方法是使用来自" stringi"的stri_count*
。包:
library(stringi)
v <- c("VES_I.MG;A;97;13;1", "VES_I.MG;A;97;13;1;2") ## An example vector
stri_count_fixed(v, ";") ## How many semicolons?
# [1] 4 5
v[stri_count_fixed(v, ";") == 4] ## Just keep when count == 4
# [1] "VES_I.MG;A;97;13;1"
答案 1 :(得分:2)
[编辑:修正了愚蠢的错误......]
以下内容适用于grep
或任何正则表达式引擎:
^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$
在命令行中使用时,请确保将其放在引号内("
在Windows上;要么在* nix上),以便shell不会解释特殊字符。
答案 2 :(得分:2)
答案 3 :(得分:2)
如果您有awk
,也可以尝试:
awk -F';' 'NF==5' file
只需将5
替换为n + 1
即可。其中n
是您的目标点数,例如您问题中的4
。
答案 4 :(得分:1)
您不需要使用前瞻,也不需要启用perl=TRUE
参数。
> v <- c("VES_I.MG;A;97;13;1", "VES_I.MG;A;97;13;1;2")
> grep("^(?:[^;]*;){4}[^;]*$", v)
[1] 1
> grep("^(?:[^;]*;){4}[^;]*$", v, value=TRUE)
[1] "VES_I.MG;A;97;13;1"
答案 5 :(得分:0)
要准确匹配一行中的四个分号,请使用正则表达式^([^;]*;){4}[^;]*$
grep:
grep -P "^([^;]*;){4}[^;]*$" ./input.txt
答案 6 :(得分:0)
使用count.fields
可以在没有正则表达式的情况下完成此操作。第一行给出计数,第二行读取行,并将其减少到具有5个字段的行。最后一行解析出字段并将其转换为一个包含4列的数据框。
cnt <- count.fields("myfile.dat", sep = ";")
L <- readLines("myfile.dat")[cnt == 5]
read.table(text = L, sep = ";")