Я новый пользователь 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
команда, но не получил требуемых результатов.
Как мне это сделать из командной строки?
При использовании 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
Как насчет 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
, Если Вы хотите сохранить вывод в тот же файл, необходимо сохранить вывод во временный файл сначала, затем удалить исходный файл и затем переименовать временный файл в исходный файл.
$ 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