我是 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
如果要将输出保存到同一个文件,您应该先将输出保存到临时文件,然后删除原始文件,然后将临时文件重命名为原始文件。