根据字段数添加额外的字符串 - Sed/Awk

use*_*333 1 unix shell awk sed

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

 null,"ABC:MNO"
"hjgy","ABC:PQR"
"mn","qwe","ABC:WER"
"mn","qwe","mno","ABC:WER"
Run Code Online (Sandbox Code Playgroud)

所有行都应该有 3 个字段,如第 3 行。我想要以下格式的数据。

"","","","ABC:MNO"
"hjgy","","","ABC:PQR"
"mn","qwe","","ABC:WER"
"mn","qwe","mno","ABC:WER" 
Run Code Online (Sandbox Code Playgroud)

如果该行以 null 开头,则应将 null 替换为 "","","",

如果只有 2 个字段,"","", 则应在 1st string 之后添加。

如果有 3 个字段,"",则应在第二个字符串之后添加

如果有 4 个字段,则什么都不做。

我能够通过使用处理第一种情况 sed 's/null/\"\",\"\",\"\"/' test.txt

但我不知道如何处理接下来的 2 个场景。

问候。

Sun*_*eep 5

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"
Run Code Online (Sandbox Code Playgroud)
  • 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,/"",/'
Run Code Online (Sandbox Code Playgroud)

类似的逻辑awk

awk -v q='"",' 'BEGIN{FS=OFS=","} {sub(/^null,/, q q q);
                c=4-NF; while (c--) $NF = q $NF} 1'
Run Code Online (Sandbox Code Playgroud)