根据字段数添加额外的字符串-Sed/Awk
我在文本文件中有以下格式的数据。
null,"ABC:MNO"
"hjgy","ABC:PQR"
"mn","qwe","ABC:WER"
"mn","qwe","mno","ABC:WER"
所有行都应该有 3 个字段,如第 3 行。我想要以下格式的数据。
"","","","ABC:MNO"
"hjgy","","","ABC:PQR"
"mn","qwe","","ABC:WER"
"mn","qwe","mno","ABC:WER"
如果该行以 null 开头,则应将 null 替换为 "","","",
如果只有 2 个字段,"","", 则应在 1st string 之后添加。
如果有 3 个字段,"",则应在第二个字符串之后添加
如果有 4 个字段,则什么都不做。
我能够通过使用处理第一种情况 sed 's/null/"","",""/' test.txt
但我不知道如何处理接下来的 2 个场景。
问候。
回答
与perl:
$ perl -pe 's/^null,/"","","",/; s/.*,K/q("",) x (3 - tr|,||)/e' ip.txt
"","","","ABC:MNO"
"hjgy","","","ABC:PQR"
"mn","qwe","","ABC:WER"
"mn","qwe","mno","ABC:WER"
s/^null,/"","","",/null先打理场地.*,K匹配到最后,一行K有助于避免不得不把这个匹配的部分放回去3 - tr|,||会给你多少字段丢失(tr返回值是,这里的出现次数)q("",)hereq()用于表示单引号字符串,因此"不需要转义x是字符串复制运算符e标志允许您在替换部分使用 Perl 代码
如果以 开头的行null,总是有两个字段,那么您还可以使用:
perl -pe 's/.*,K/q("",) x (3 - tr|,||)/e; s/^null,/"",/'
类似的逻辑awk:
awk -v q='"",' 'BEGIN{FS=OFS=","} {sub(/^null,/, q q q);
c=4-NF; while (c--) $NF = q $NF} 1'