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 个场景。
问候。
与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)
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |