Итеративное редактирование текста в файле с помощью команд

Я новый пользователь Ubuntu. Пожалуйста, помогите мне в решении следующей проблемы:

Мой входной текстовый файл

    -0.716425 -12.8939 -3.3341 -7.38497 -2.62709 3.00437
    -6.69861 -13.8853 -5.81095 -7.37465 -0.268193 -5.45344

Мой выходной текстовый файл должен выглядеть как

    1:-0.716425 2:-12.8939 3:-3.3341 4:-7.38497 5:-2.62709 6:3.00437
    7:-6.69861 8:-13.8853 9:-5.81095 10:-7.37465 11:-0.268193 

Я пытался sed команда, но не получил требуемых результатов.

Как мне это сделать из командной строки?

1
задан 13 April 2015 в 02:43

3 ответа

При использовании GNU awk (простофиля), можно выполнить это с умным рекордным разделением:

awk '{ORS=RT; print NR":"$0}' RS='[ \n]+' infile

Вывод:

1:-0.716425 2:-12.8939 3:-3.3341 4:-7.38497 5:-2.62709 6:3.00437
7:-6.69861 8:-13.8853 9:-5.81095 10:-7.37465 11:-0.268193 12:-5.45344
0
ответ дан 13 April 2015 в 02:43

Как насчет python:

#!/usr/bin/env python2
with open('/path/to/file.txt') as f:
    prev = 0
    for line in f:
        elements = line.rstrip().split()
        for i in range(len(elements)):
            print str(prev + i + 1) + ':' + elements[i],
        print '\n'.rstrip()
        prev = len(elements)

Вывод:

1:-0.716425 2:-12.8939 3:-3.3341 4:-7.38497 5:-2.62709 6:3.00437 
7:-6.69861 8:-13.8853 9:-5.81095 10:-7.37465 11:-0.268193 12:-5.45344

, Если Вы хотите сохранить вывод в тот же файл, необходимо сохранить вывод во временный файл сначала, затем удалить исходный файл и затем переименовать временный файл в исходный файл.

0
ответ дан 13 April 2015 в 02:43
$ cat file
-0.716425 -12.8939 -3.3341 -7.38497 -2.62709 3.00437
-6.69861 -13.8853 -5.81095 -7.37465 -0.268193 -5.45344
$ awk '{for (i=1;i<=NF;i++)printf "%s:%s%s",++n,$i,OFS;print""}' file
1:-0.716425 2:-12.8939 3:-3.3341 4:-7.38497 5:-2.62709 6:3.00437 
7:-6.69861 8:-13.8853 9:-5.81095 10:-7.37465 11:-0.268193 12:-5.45344 

, Как это работает

  • for (i=1;i<=NF;i++)printf "%s:%s%s",++n,$i,OFS

    , Это циклично выполняется по каждому полю на строке и распечатывает его с предварительно ожидаемым числом. Переменная n является числом. ++n инкременты n к одному каждому разу это вызывается.

  • print""

    Это печатает новую строку в конце каждой строки.

Для обновления файла на месте

awk '{for (i=1;i<=NF;i++)printf "%s:%s%s",++n,$i,OFS;print""}' file >file.tmp && mv file.tmp file

Или, с новейшие версии из GNU awk (4.1.0 +, в Ubuntu 14.10 + ):

gawk -i inplace '{for (i=1;i<=NF;i++)printf "%s:%s%s",++n,$i,OFS;print""}' file
2
ответ дан 13 April 2015 в 02:43

Другие вопросы по тегам:

Похожие вопросы: