用连续标签替换“\ tNA \ t”

时间:2016-03-04 08:55:10

标签: linux awk gsub

格式错误的tsv文件到处都是空字段。我希望在linux上用“NA”填充这些空白区域。

我尝试了awk '{gsub("\t\t","\tNA\t"); print$0)',但只将一个空格替换为NA实例。链接命令awk '{gsub("\t\t","\tNA\t"); print$0)|awk '{gsub("\t\t","\tNA\t"); print$0)每行进行两次替换 - 但如果我有很多列要处理,则不是特别有用。

有更快(更整洁)的方法吗?

3 个答案:

答案 0 :(得分:1)

你尝试过sed吗?例如:

cat test.txt
test        test        test
test        test        test

sed 's:\t\t*:\tNA\t:g' test.txt

test    NA  test    NA  test
test    NA  test    NA  test

答案 1 :(得分:1)

它有点复杂,因为你必须处理换行空字段,行尾空字段和可能连续的空字段。我无法用sed实现某些目标,这可能是疯了。但是使用awk这似乎有效:

$ cat test.txt
a       c   d   e
    g   h   i   j
k   l   m   n   
p           s   t
        w   x   

$ awk -F$'\t' '{for(i=1;i<=NF;++i){if($i==""){printf "NA"}else{printf $i} if(i<NF)printf "\t"} printf "\n"}' test.txt 
a   NA  c   d   e
NA  g   h   i   j
k   l   m   n   NA
p   NA  NA  s   t
NA  NA  w   x   NA

当心复制粘贴,选项卡可能会转换为空格......顺便说一句,我搜索了CSV文件的解决方案,并从this thread;)进行了调整,你可以看到最可读的选项是一个awk。

答案 2 :(得分:0)

好的,这有效: awk '{ gsub(/\t\t\t/,"\tNA\tNA\t"); print $0}' test.txt | awk '{ gsub(/\t\t/,"\tNA\t"); print $0}' | awk '{ gsub(/\t\t/,"\tNA\t"); print $0}' | awk '{gsub(/^[\t]+/,"NA\t"); print $0}'

有趣的是,这并不是: awk '{ gsub(/\t\t\t/,"\tNA\tNA\t"); print $0}' test.txt | awk '{ gsub(/\t\t/,"\tNA\t"); print $0}' | awk '{gsub(/^[\t]+/,"NA\t"); print $0}'

我确信有一个更优雅的解决方案..