Альтернативный 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
самостоятельно безpaste
:sed -r 'N;s/\n(\w+)/\1&/;P;D' somefile.txt
sed
программы для развлечения, то, возможно, вам стоит попробовать себя в code-golf ;-)На мой взгляд, самый простой и читаемый подход:
cut
)tail
)paste
)Пример: ваш пример выходного файла:
Затем выполните следующую команду в терминале
Вывод:
Структура этого решения отличается от приведенных ответов. Нет необходимости условий, циклов или регулярных выражений.
источник