Замените пробел в конце строки конкретной строкой - PullRequest
1 голос
/ 08 августа 2011

Я имею дело с файлом, разделенным пробелом, с 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 полей.В этих случаях за 0 в поле 5 следует пробел ('0').

Я хотел бы найти все вхождения пробела в конце строки (т. Е. \ S $)и замените его пробелом NA (то есть '\ sNA'), но у меня возникают реальные проблемы с этим.Например, я пробовал sed:

sed s/\\s$/\\sNA/g

, но он не работает.Кто-нибудь может мне помочь?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 08 августа 2011

Вы можете сделать это в чистой оболочке bash, избегая запуска процессов sed или awk:

while read line; do
  printf "%s" "$line"
  nbchar=${#line}
  if [ ${line:$((nbchar-1))} == " " ] ; then printf "NA"; fi
  printf "\n"
done < your_file
2 голосов
/ 08 августа 2011

Вот пара эквивалентных решений в awk:

awk '{ printf("%s", $0) } NF == 5 { printf("NA") } { printf("\n") }

и

awk '{ print $0 (NF==5 ? "NA" : "") }'
2 голосов
/ 08 августа 2011

Поставьте реальный пробел вместо \ s и используйте одинарную кавычку ('), чтобы избежать оболочки для выполнения подстановки переменных:

sed -e 's/ $/ NA/'
2 голосов
/ 08 августа 2011
  1. \s нельзя использовать в строке замены, поскольку она является классом.
  2. Вероятно, $ интерпретируется оболочкой.

Попробуйте:

sed -e's/\s$/ NA/' 
...