Awk 使用sed删除冒号后不存在数据的记录

Awk 使用sed删除冒号后不存在数据的记录,awk,sed,Awk,Sed,我在一个文件中有以下格式的数据 id : 315,abcid :,abcname :,abcrole :,abctest :,abcsts : Active,abcqwe : id : 316,abcid :1234 ,abcname : Test,abcrole : No,abctest : 2345,abcsts : Active,abcq

我在一个文件中有以下格式的数据

id : 315,abcid                 :,abcname                 :,abcrole                :,abctest                :,abcsts : Active,abcqwe                :
id : 316,abcid :1234 ,abcname : Test,abcrole : No,abctest : 2345,abcsts : Active,abcqwe                :
我正在尝试以以下格式获取在之后包含数据的所有字段:--

我尝试使用sed来删除整个记录,但没有成功

感谢您的帮助

向救援人员致意

perl -pe 's/(,|^)\S+\s*:(?=,|$)//g' file
(?=…)
是一个前瞻性断言,即它检查以下字符是否为逗号或行尾,但不会删除它,也不会提前下一次搜索的位置


输出与您指定的不同:它还删除了最后的逗号。

在我看来,使用awk更好:

$ awk 'BEGIN{RS=",|\n";ORS=",";FS=":";OFS=FS}$2!="";RT=="\n"{printf "\n"}' file1
id : 315,abcsts : Active,
id : 316,abcid :1234 ,abcname : Test,abcrole : No,abctest : 2345,abcsts : Active,
RS
:输入记录分隔符(逗号或新行)
ORS
:输出记录分隔符
FS
:字段分隔符
OFS:输出字段分隔符
$2
:使用FS作为分隔符分隔的第二个字段
RT
:记录正在使用的分隔符值(逗号或新行)

我的解决方案是基于调整awk
RS
FS
值。 使用基本的awk代码段,您可以在数据上获得一些不错的结果,如下所示:

$ awk 'BEGIN{RS=",|\n";FS=":";OFS=FS}$1=$1'  file1
id : 315
abcid                 :
abcname                 :
abcrole                :
abctest                :
abcsts : Active
abcqwe                :
id : 316
abcid :1234 
abcname : Test
abcrole : No
abctest : 2345
abcsts : Active
abcqwe
整行用逗号分隔。 每个生成的行包含格式为

property:value
Short
sed
解决方案-删除无效字段:

  • [^:,]*
    -匹配字段名,该字段名应使用除
    和空白以外的任何字符显示
  • “*”
    -字段名后面可以跟可选的空格
  • -匹配
    作为字段名和字段值之间的分隔符
  • (*,|$)
    -regex alternation group,匹配空字段值(可以用可选空格表示)
    “*”
    ),后跟
    (作为键/值对之间的分隔符)或字符串的结尾
    $

输出:

id : 315,abcsts : Active,
id : 316,abcid :1234 ,abcname : Test,abcrole : No,abctest : 2345,abcsts : Active,

您还可以使用以下
sed
命令:

sed 's/[[:alnum:]]*\s*:\s*[,]\s*//g; s/,[[:alnum:]]*\s*:$/,/g' input_active.in
测试:

这可能适合您(GNU-sed):


迭代地将逗号后跟一个单词(不包含逗号),后跟一个或多个空格,后跟一个冒号后跟一个逗号,或将行尾替换为逗号或行尾。

您尝试了什么sed表达式?后面的数据:“是什么意思?”?为什么
:,abcname
不是数据?当我说数据时,它意味着之间应该存在一些东西:而且,代码很好,先生,请你解释一下。我们可以从中学到更多,谢谢++
id : 315,abcsts : Active,
id : 316,abcid :1234 ,abcname : Test,abcrole : No,abctest : 2345,abcsts : Active,
sed 's/[[:alnum:]]*\s*:\s*[,]\s*//g; s/,[[:alnum:]]*\s*:$/,/g' input_active.in
sed -r ':a;s/,[^,]+\s*:(,|$)/\1/;ta' file