2011-08-08 4 views
1

Я имею дело с пространством файла с разделителями с 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 

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

Спасибо!

ответ

2

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

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

и

awk '{ print $0 (NF==5 ? "NA" : "") }' 
2
  1. \s не может использоваться в заменяющей строке, так как это класс.
  2. $, вероятно, интерпретируется оболочкой.

Try:

sed -e's/\s$/ NA/' 
+0

Привет Дуглас, спасибо за быстрый ответ! Я попытался ввести символ пробела таким образом, но получаю ошибку: sed: -e выражение # 1, char 5: команда unterminated 's – susjoh

+0

Извинения! Это работает - я вызывал команду через другую программу и не использовал одиночные кавычки. Мои привычки Windows трудно сломать! – susjoh

2

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

sed -e 's/ $/ NA/' 
+0

Спасибо jfgagne. Одиночные кавычки зафиксировали это. – susjoh

2

Вы можете сделать это в чистом Баш оболочки, избегая, чтобы начать SED или AWK процесс:

while read line; do 
    printf "%s" "$line" 
    nbchar=${#line} 
    if [ ${line:$((nbchar-1))} == " " ] ; then printf "NA"; fi 
    printf "\n" 
done < your_file 
+1

Это может быть немного проще: 'case '$ line" in (* "") echo "$ {line} NA" ;; (*) echo "$ line" ;; esac' –

Смежные вопросы