Как напечатать первый столбец следующей строки в текущей строке?

Если у вас есть соединение с внешним сервером smtp с вашим хостом, вы можете настроить smtp на своем хосте и отправлять электронные письма.

Конфигурацию Smtp в шагах Linux можно найти здесь: http://kerneltalks.com/config/guide-smtp-configuration-linux/

Примеры почтовых команд можно найти здесь: http: //kerneltalks.com/commands/examples-send-email-through-terminal/

8
12.01.2017, 11:01
4 ответа

Вот уродливый sed способ просто для удовольствия

sed '2,$ s/[^ ]\+/& &/; 2,$ s/ /\n/' file | paste -d ' ' - -
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135 

Объяснение

  • 2, $ из второй строки до последнего
  • s / [^] \ + / & & / удваивает первый набор непробельных символов
  • ; разделяет команды, как в оболочке
  • s / / \ n / заменить первый пробел новой строкой
  • paste -d '' - - склеить этот беспорядок (добавить вторую строку к третьей, четвертую строку к третьей и т. Д.)
9
27.01.2020, 20:08

Запомните предыдущую строку:

awk 'NR > 1 { print prev, $1 } { prev = $0 } END { print prev }'

Это обрабатывает ввод следующим образом:

  • если текущая строка является второй или большей, вывести предыдущую строку (сохранена в prev , см. Следующий шаг ) и первое поле текущей строки, разделенные разделителем выходных полей (пробел по умолчанию);
  • во всех случаях сохранить текущую строку в переменной prev ;
  • at конец файла, выведите предыдущую строку.
16
27.01.2020, 20:08

Альтернативный подход 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

Здесь применима та же идея о последней строке новой строки.

11
27.01.2020, 20:08

На мой взгляд, самый простой и читаемый подход:

  1. извлечь первый столбец (вырезать)
  2. удалить первую строку из извлеченного столбца (tail)
  3. вставьте этот столбец в исходный файл (paste)

Пример: ваш пример входного файла:

abc 123    
abc 789  
bcd 456  
acb 135

Затем выполните следующую команду в терминале

cut -d' ' -f1 in.txt | tail -n +2 | paste -d' ' file -

Вывод:

abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135

Структура этого решения отличается от данных ответов. Нет необходимости в условиях, циклах или регулярных выражениях.

1
27.01.2020, 20:08

Теги

Похожие вопросы