Answers:
替代awk
方法:
$ awk 'NR == 1{printf "%s", $0;next}{printf " %s\n%s", $1,$0}' input.txt
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
它的工作方式很简单:第一行是特殊情况-我们不用换行就打印它,并告诉awk转到下一行而不执行其他代码块。之后,NR == 1{printf "%s", $0;next}
被跳过,但是其他部分完成了工作。
请记住,到目前为止,我们打印的格式字符串不带换行符。因此,printf " %s\n%s",$1,$0
现在要做的是打印出第一个单词(并且因为没有换行,所以它保持在输出的同一行),插入换行符,然后插入整行本身(但不以换行符结尾) 。因此,下一个插入的第一个单词将保留在同一行。过程不断进行直到我们到达文件末尾。
可能的改进是包括END{print ""}
插入最终换行符的块。在某些情况下,可能需要其他脚本处理生成的文件。
当用户特别要求AWK时,可以使用其他语言(例如Python)采用与打印格式化字符串相同的方法。为那些好奇如何用其他语言实现的人提供了Python替代品:
#!/usr/bin/env python
from __future__ import print_function
import sys
old = None
for index,line in enumerate(sys.stdin):
if index == 0:
print(line.strip(),end=" ")
continue
words = line.strip().split()
print(words[0] + "\n" + line.strip(),end=" ")
用法如下:
$ ./append_first.py < input.txt
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
关于最终换行符的想法也适用于此。
这是一个sed
有趣的丑陋方式
sed '2,$ s/[^ ]\+/& &/; 2,$ s/ /\n/' file | paste -d ' ' - -
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
2,$
从第二行到最后一行s/[^ ]\+/& &/
将第一组非空白字符加倍;
分隔命令,例如在shell中s/ /\n/
用换行符替换第一个空格paste -d ' ' - -
将此烂摊子粘在一起(将第二行添加到第三行,将第四行添加到第三行,等等)sed
有趣的程序,那么也许您应该去编码高尔夫 ;-)
sed
在没有以下情况的情况下paste
sed -r 'N;s/\n(\w+)/\1&/;P;D' somefile.txt