用特定字符串替换行尾的空格字符

时间:2011-08-08 08:02:05

标签: linux sed awk whitespace replace

我正在处理带有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

但它不起作用。有人可以帮助我吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

  1. \s不能用于替换字符串,因为它是一个类。
  2. $可能正由shell解释。
  3. 尝试:

    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