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
:记录正在使用的分隔符值(逗号或新行)
我的解决方案是基于调整awkRS
和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
Shortsed
解决方案-删除无效字段:
-匹配字段名,该字段名应使用除[^:,]*
,:
和空白以外的任何字符显示,
-字段名后面可以跟可选的空格“*”
-匹配:
作为字段名和字段值之间的分隔符:
-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