сценарий оболочки для чтения и печати части строки - PullRequest
0 голосов
/ 10 сентября 2009

Добрый день участники,

У меня есть входной файл, в котором есть строки числовых цифр (около 2000 строк). Я хочу извлечь «вторые-восьмые цифры справа» из каждой строки числовой строки в отдельный файл с результат, разделенный запятой, как показано.

Пример: input.txt

+00000000000001303275310752

+00000000000001827380519015

+00000000000000800081610361

+00000000000000449481894004

+00000000000000449481894004

+00000000000001812612607514

Ожидаемый результат: newfile.txt

7531075

8051901

8161036

8189400

8189400

1260751

Полагаю, что-то вроде 'sed' может быть использовано для решения моей проблемы, но я не совсем уверен, как этого добиться. Я подключен к компьютеру, работающему на Solaris 5.10. Оцените, если кто-нибудь может дать мне краткое объяснение.

С уважением,

начинающий.

Ответы [ 4 ]

2 голосов
/ 10 сентября 2009

Для ввода с фиксированной шириной попробуйте:

cut -c19-26 input.txt | sed 's/$/,/'

, то есть, извлеките 19–26-й символ входного текста, а затем замените конец строки запятой.

Если у вас есть линии переменной длины, вам нужно что-то немного другое.

1 голос
/ 10 сентября 2009

Попробуйте:

perl -pe 's/^.*(\d{7})\d$/$1,/' < input.txt

Или, если вам не нравятся регулярные выражения:

perl -pe '$_ = substr($_,-9,-2) . ",\n"' < input.txt

Это будет работать для любой линии фиксированной или переменной длины.

1 голос
/ 10 сентября 2009

Вы можете обрезать ведущие нули с помощью:

sed 's/^0*//g'

Таким образом, что-то вроде:

sed 's/^0*//g' input.txt | sed 's/$/,/'

должно работать.

0 голосов
/ 20 сентября 2009

Вот решение на python, оно должно быть интуитивно понятным:

$ cat data2
00000000000001303275310752
00000000000001827380519015
00000000000000800081610361
00000000000000449481894004
00000000000000449481894004
00000000000001812612607514

$ cat digits.py
import sys
for line in sys.stdin:
    print '%s,' % (line[-9:-2])

$ python digits.py < data2
7531075,
8051901,
8161036,
8189400,
8189400,
1260751,
...