Awk 将制表符分隔的文件中的空字段替换为";0“;

Awk 将制表符分隔的文件中的空字段替换为";0“;,awk,sed,Awk,Sed,假设我有一个数据文件,其中的行类似于a^I^I^I^I^I^Ib^Ic,由^I分隔(表示一个选项卡) 现在,我想将每列的空值改为0,因此结果应该是:a^I0^I0^I0^I0^I0^Ib^Ic 如何仅使用一个sed命令实现此目标?使用支持前瞻性的工具更容易做到这一点: perl -pe 's/\t(?=\t)/\t0/g' file 这将在任何一对制表符之间放置一个“0”。前瞻是有用的,因为它匹配第二个选项卡而不使用它,所以可以在下一个匹配中使用它 以下是一种使用awk的方法: awk -F'

假设我有一个数据文件,其中的行类似于
a^I^I^I^I^I^Ib^Ic
,由
^I
分隔(表示一个选项卡)

现在,我想将每列的空值改为0,因此结果应该是:
a^I0^I0^I0^I0^I0^Ib^Ic


如何仅使用一个sed命令实现此目标?

使用支持前瞻性的工具更容易做到这一点:

perl -pe 's/\t(?=\t)/\t0/g' file
这将在任何一对制表符之间放置一个“0”。前瞻是有用的,因为它匹配第二个选项卡而不使用它,所以可以在下一个匹配中使用它

以下是一种使用awk的方法:

awk -F'\t' -v OFS='\t' '{ for (i = 1; i <= NF; ++i) sub(/^$/, 0, $i) } 1' file

awk-F'\t'-vofs='\t'{for(i=1;i使用支持前瞻的工具更容易做到这一点:

perl -pe 's/\t(?=\t)/\t0/g' file
这将在任何一对制表符之间放置一个“0”。超前搜索很有用,因为它匹配第二个制表符而不使用它,因此可以在下一个匹配中使用它

以下是一种使用awk的方法:

awk -F'\t' -v OFS='\t' '{ for (i = 1; i <= NF; ++i) sub(/^$/, 0, $i) } 1' file

awk-F'\t'-vofs='\t'{for(i=1;iother
awk

$ awk -v RS='\t' -v ORS='\t' '$0==""{$0=0}1'
或者用BEGIN块

$ awk 'BEGIN{RS=ORS="\t"} $0==""{$0=0}1'

另一个
awk

$ awk -v RS='\t' -v ORS='\t' '$0==""{$0=0}1'
或者用BEGIN块

$ awk 'BEGIN{RS=ORS="\t"} $0==""{$0=0}1'
使用GNU时:

sed ':a;s/\t\(\t\|$\)/\t0\1/;ta' file
将所有
\t
后跟
\t
或行尾替换为
\t0
使用GNU-sed:

sed ':a;s/\t\(\t\|$\)/\t0\1/;ta' file
$ awk '{while(gsub(/\t\t/,"\t0\t"));} 1' file
a       0       0       0       0       0       0       b       c

将所有
\t
后跟
\t
或行尾替换为
\t0

,这样您的真实数据就没有
^ |
,它实际上有制表符?这样您的真实数据就没有
^ |
,它实际上有制表符?这将在o的末尾添加一行,其中只包含一个制表符,没有终止换行utput使结果不是POSIX文本文件。这将在输出的末尾添加一行,其中只包含一个制表符,没有终止换行符,从而使结果不是POSIX文本文件。
$ awk '{while(gsub(/\t\t/,"\t0\t"));} 1' file
a       0       0       0       0       0       0       b       c