Parsing 如何使用';grep';命令
假设我们有下面的记录Parsing 如何使用';grep';命令,parsing,csv,grep,Parsing,Csv,Grep,假设我们有下面的记录{(XXX1),(XXX2)},不管我想要什么,根据以下规则提取信息,最好使用'grep':如果{}包含少于或等于两个唯一的元素,即()中的元素,则保留(两者),否则删除整行。作为进一步的步骤,我想提取()中的值,并最终以以下形式写入剩余的行:XXX1、XXX2,无论什么 更新: 对于以下输入: {(XXX1),(XXX2)},whatever,unique=2 {(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2 {(XXX1)},
{(XXX1),(XXX2)},不管我想要什么,根据以下规则提取信息,最好使用'grep':如果{}包含少于或等于两个唯一的元素,即()中的元素,则保留(两者),否则删除整行。作为进一步的步骤,我想提取()中的值,并最终以以下形式写入剩余的行:XXX1、XXX2,无论什么
更新:
对于以下输入:
{(XXX1),(XXX2)},whatever,unique=2
{(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2
{(XXX1)},whatever,unique=1
{},whatever,unique=0
{(XXX1),(XXX2),(XXX3),(XXX4)},whatever
我应该得到以下输出:
XXX1,XXX2,whatever,unique=2
XXX1,whatever,unique=1
awk可以做到,检查一下这个班轮:
awk -F'[}{]' '{split($2,a,",");delete(b);for(x in a)b[a[x]]}length(b)<=2' file
试验
kent$cat文件
{(XXX1),(XXX2)},无论如何,唯一=2
{(XXX1),(XXX1),(XXX1),(XXX2)},不管怎样,唯一=2
{(XXX1)},无论如何,唯一=1
{},不管怎样,unique=0
{(XXX1)、(XXX2)、(XXX3)、(XXX4)},随便什么
肯特$awk-F'[}{]'{gsub(/[()]/,”);拆分($2,a,“,”);删除(b);对于(a中的x)b[a[x]];l=length(b)}l0{s=“”;对于(b中的x)s=s“x”;“sub(/,$/,”,s);y[s]=s$3}结束{对于(y中的x)打印y[x]}文件
XXX1,XXX2,不管怎样,唯一=2
XXX1,无所谓,唯一=1
您无法(可靠地)使用grep处理csv数据,因为cvs条目可以跨越多行。即使您没有任何一行,grep也可能无法确定某个给定的逗号(或任何分隔符)是在一个条目内还是将它们分开。很好,谢谢!那么你会推荐我什么呢?有,但我还没有研究它能做什么和不能做什么。除此之外,使用一些合适的CSV解析器和编写器/序列化器,并在上面实现逻辑。我个人会检查ruby gems,但语言的选择可能取决于你所知道的w、 什么是无论什么部分?它能包含类似(…),(…)的内容吗
?@kent:No.“whatever”表示行的其余部分,不需要进一步转换。它只是“纯”CSV数据,例如:aaa1、hkah1、kajki7。它唯一包含的特殊字符是逗号。谢谢!差不多了!请参考我的问题。只需发布更新。
kent$ cat file
ok,{(XXX1),(XXX2)},whatever,unique=2
ok,{(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2
ok,{(XXX1)},whatever,unique=1
ok,{},whatever,unique=0
nok,{(XXX1),(XXX2),(XXX3),(XXX4)},whatever
kent$ awk -F'[}{]' '{split($2,a,",");delete(b);for(x in a)b[a[x]]}length(b)<=2' file
ok,{(XXX1),(XXX2)},whatever,unique=2
ok,{(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2
ok,{(XXX1)},whatever,unique=1
ok,{},whatever,unique=0
awk -F'[}{]' '{gsub(/[()]/,"");split($2,a,",");delete(b);for(x in a)b[a[x]];l=length(b)}l<=2&&l>0{s="";for(x in b)s=s""x",";sub(/,$/,"",s);y[s]=s $3}END{for(x in y)print y[x]}' file
kent$ cat file
{(XXX1),(XXX2)},whatever,unique=2
{(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2
{(XXX1)},whatever,unique=1
{},whatever,unique=0
{(XXX1),(XXX2),(XXX3),(XXX4)},whatever
kent$ awk -F'[}{]' '{gsub(/[()]/,"");split($2,a,",");delete(b);for(x in a)b[a[x]];l=length(b)}l<=2&&l>0{s="";for(x in b)s=s""x",";sub(/,$/,"",s);y[s]=s $3}END{for(x in y)print y[x]}' file
XXX1,XXX2,whatever,unique=2
XXX1,whatever,unique=1