格式错误的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)
每行进行两次替换 - 但如果我有很多列要处理,则不是特别有用。
有更快(更整洁)的方法吗?
答案 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}'
我确信有一个更优雅的解决方案..