我正在处理带有6个字段的空格分隔文件:
Pop1 ID60776 62 C 10 62
Pop1 ID62442 13 A 2 13
Pop1 ID63614 56 C 0
Pop1 ID67511 61 T 37 61
Pop1 ID68222 51 A 0
Pop1 ID68407 65 C 16 65
然而,在第3和第5行中,只有5个字段。在这些情况下,字段5中的0后跟空格字符('0')。
我想在一行的末尾找到一个空格字符的所有实例(即\ s $),并用空格NA(即'\ sNA')替换它,但我真的遇到了麻烦。例如,我尝试过sed:
sed s/\\s$/\\sNA/g
但它不起作用。有人可以帮助我吗?
谢谢!
答案 0 :(得分:2)
\s
不能用于替换字符串,因为它是一个类。$
可能正由shell解释。尝试:
sed -e's/\s$/ NA/'
答案 1 :(得分:2)
以下是awk
中的几个等效解决方案:
awk '{ printf("%s", $0) } NF == 5 { printf("NA") } { printf("\n") }
和
awk '{ print $0 (NF==5 ? "NA" : "") }'
答案 2 :(得分:2)
放置一个真实空格而不是\ s,并使用单引号('
)来避免shell执行变量替换:
sed -e 's/ $/ NA/'
答案 3 :(得分:2)
您可以在纯bash shell中执行此操作,避免启动sed或awk进程:
while read line; do
printf "%s" "$line"
nbchar=${#line}
if [ ${line:$((nbchar-1))} == " " ] ; then printf "NA"; fi
printf "\n"
done < your_file