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