У меня есть файл из 2000 строк и 1 столбец
1007_s_at1
1007_s_at2
1007_s_at3
1007_s_at4
1007_s_at5
1007_s_at6
1007_s_at7
1007_s_at8
1007_s_at9
1007_s_at10
выглядит как выше, я хочу удалить последнее числовое значение после "at". В принципе, любое число в последнем случае должно быть усечено.
Я пробовал такие вещи, как расщепление их, а затем их воссоздание, но это просто усложняет проблему, и я далеко от ответа.
Не могли бы вы предложить что-то в bash или shell или python или perl, чтобы решить эту проблему.
Требуется выход, как показано ниже.
1007_s_at
1007_s_at
1007_s_at
1007_s_at
1007_s_at
1007_s_at
1007_s_at
1007_s_at
1007_s_at
1007_s_at
спасибо
sed -i -e 's/[[:digit:]]*$//' filename
g
означает «глобальный», что означает, что он будет применять подстановку столько раз, сколько соответствует шаблону. Поскольку я использую якорь ( $
), флаг не имеет смысла, и я удалил его.
С Perl:
perl -p -e "s/\d+$//" input.txt > output.txt
Просто передайте string.digits
в .rstrip()
чтобы удалить цифры из правой части ваших строк:
import string
with open('inputfile') as infile, open('outputfile') as outfile:
for line in infile:
outfile.write(line.rstrip().rstrip(string.digits) + '\n')
питон
Просто разделите все цифры с конца.
>>> "1007_s_at10".rstrip('01234567890')
'1007_s_at'
Если изменяется только число в конце, вы можете сцепить:
>>> a = '1007_s_at1'
>>> a[0:9]
'1007_s_at'
Никто еще не предложил решение bash:
shopt -s extglob
while read line; do
echo "${line%%*([0-9])}"
done < filename
Если вы используете Linux или Unix, просто одно решение для линейки:
perl -i.bak -pe 's/\d+$//g' file.txt
если Windows:
perl -i.bak -pe "s/\d+$//g" file.txt
Если вы уже знаете, что он делает, тогда хорошо и хорошо, в противном случае, очень просто, переключатель -i
с .bak
сначала создаст резервную копию file.txt
и file.txt.bak
его file.txt.bak
.
Опция -p
затем перебирает записи в файле и печатает/сохраняет результат в file.txt
после того, как s/\d+$//g
удаляет цифры в конце.