2015-01-23 2 views
0

У меня есть большой файл, который мне нужно условно удалить последнее числовое поле только из строк, начинающихся с цифр 1-19. Я хочу распечатать весь файл по строкам, включая те строки, которые не соответствуют этому условию.Снять последнее поле с числовой строки условно

Вот мой код:

cat > test.txt 
118222 
1 0.5632 0.10 0.05 1.00 0.45 5.00 0.50 0 
0.54 0.49 0.58 0.74 1.08 1.75 1.97 1.86 1.51 1.03 0.76 0.52 
0.22 0.20 0.21 0.25 0.37 0.58 0.61 0.64 0.55 0.45 0.39 0.23 
0.17 0.20 0.18 0.14 0.10 0.10 0.10 0.10 0.09 0.09 0.11 0.12 
5 0.0172 0.10 0.05 1.00 0.45 5.00 0.50 1 
0.35 0.32 0.39 0.71 1.15 1.87 1.96 1.72 1.36 0.91 0.70 0.43 
0.31 0.30 0.29 0.27 0.36 0.57 0.57 0.57 0.46 0.35 0.34 0.31 
0.28 0.29 0.26 0.16 0.11 0.11 0.12 0.11 0.11 0.10 0.14 0.26 

#!/bin/bash 

FILE=test.text 
while read i; do 
echo ${i} | grep -E '^([1-9]|1[0-9])' && sed 's/.$//' || echo ${i} 
done < $FILE 

Это не работает, хотя Grep и SED линии работают индивидуально.

Любая помощь была бы принята с благодарностью!

ответ

1

Используйте условную замену в sed.

sed '/^\([1-9]\|1[0-9]\) /s/.$//' test.text 

Я добавил пробел после совпадения числа в начале. В противном случае он также будет соответствовать 118222, который не находится в диапазоне 1-19, так как он начинается с 1.

DEMO

Ваше название говорит, что вы хотите, чтобы удалить последний символ из строки, вопрос говорит последний числового характер. Для последнего это должно быть:

sed '/^\([1-9]\|1[0-9]\) /s/[0-9]\([^0-9]*\)$/\1/' test.text 
+0

Да, это полностью работает. Я использовал второй, так как мне захотелось удалить числовой символ. Извините за отсутствие ясности в моем названии. Мне действительно нужно больше времени уделять учебникам sed. Спасибо! – user3367135