使用sed冒号后,如果没有数据,则删除记录

时间:2018-01-23 08:31:07

标签: awk sed

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

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

我试图获取所有具有数据的字段:以下格式: -

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

我尝试使用sed但删除了整个记录。

感谢任何帮助。

此致

5 个答案:

答案 0 :(得分:3)

foreach (reservation rr in bowlingav) { var sql = from r in db.reservations where rr.Id != r.Id && rr.end_time < theEndTimeChosen select r; } 解决方案 - 删除无效的字段:

sed
  • sed -E 's/[^:, ]* *:( *,|$)//g' file - 匹配字段名称,除了[^:, ]*:和空白
  • 之外,该字段应与任何字符一起显示
  • , - 字段名称可以跟随可选的空格
  • ' *' - 将:字段名称字段值之间的分隔符匹配
  • : - 正则表达式替换组,匹配字段值(可能带有可选空格( *,|$)),后跟' *'(如键/值对之间的分隔符)或字符串,
  • 的结尾

输出:

$

答案 1 :(得分:2)

Perl救援!

perl -pe 's/(,|^)\S+\s*:(?=,|$)//g' file

(?=...)是一个先行断言,即它检查后面的字符是逗号还是行尾,但是没有删除它并且没有提升位置下次搜索。

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

答案 2 :(得分:2)

在我看来,用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 RSFS值。 您可以使用这样的基本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

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed -r ':a;s/,[^,]+\s*:(,|$)/\1/;ta' file

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

答案 4 :(得分:0)

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

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

<强>测试

enter image description here