使用命令在文件中迭代编辑文本

使用命令在文件中迭代编辑文本

我是 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

$ 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

如果您使用 GNU awk (gawk),您可以通过巧妙的记录分割来实现这一点:

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

答案3

怎么样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

如果要将输出保存到同一个文件,您应该先将输出保存到临时文件,然后删除原始文件,然后将临时文件重命名为原始文件。

相关内容