Повторите значения 1-го столбца в 1-й строке ниже пустого пространства следующей строки - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть ввод, как показано ниже, из системы

a b c d
  h i j
  e f g

a q w e 
  r r t
  y u i

a i o p
  j k l
  t y u

, и мне нужно организовать вывод как

a b c d
a h i j
a e f g

a q w e 
a r r t
a y u i

a i o p
a j k l
a t y u

Я уже пробовал с 'awk' как

awk -v FS="[[:space:]][[:space:]]+" -v OFS="/t" '{print $1,$2,$3,$4}' .

Ответы [ 5 ]

0 голосов
/ 20 сентября 2018
$ awk '{if (/^ /) $1=val FS $1; else val=$1} 1' file
a b c d
a h i j
a e f g

a q w e
a r r t
a y u i

a i o p
a j k l
a t y u
0 голосов
/ 20 сентября 2018

Это может сработать для вас (GNU sed):

 sed 'N;s/^\(\(\S*\s*\).*\n\)\s*\b/\1\2/;P;D' file

Заменить пустое пространство в начале непустой строки на первый столбец предыдущих строк и следующие пробелы.

0 голосов
/ 20 сентября 2018

Вы можете использовать awk логику, как показано ниже

awk 'a=/^ /{sub(/^[[:space:]]/,"",$0);$0=x$0}!a{x=$1}1' file

, которая должна печатать вывод, как и ожидалось.

Как это работает?

  1. условие a=/^ / вернет 0 для строк, которые не начинаются с пустого поля.Таким образом, в этих строках мы резервируем значение $1 в переменной x
  2. Для строк, начинающихся с пустого поля, условие будет 1, поэтому мы удаляем наш единственный начальный пробел из существующегои добавьте предыдущее значение $1 (переменная x)

Логика совместима с любой версией awk и не зависит от количества полей в каждой строке.

0 голосов
/ 20 сентября 2018

Не могли бы вы попробовать, следуя инструкциям, также позаботиться об удалении начального пространства.

awk '{value=$0~/^ /?value:$1} /^ /{sub(/^ +/,value OFS)} 1' Input_file

Объяснение: Добавление пояснения к приведенному выше коду тоже.

awk '
{
  value=$0~/^ /?value:$1  ##Create variable named value whose value is variable value when line starts with space else it will be first field value.
}
/^ /{                     ##Checking if a line starts with space then do following.
  sub(/^ +/,value OFS)    ##Substituting initial space with variable value and OFS value in current line.
}
1                         ##Mentioning 1 here to print edited/non-edited value of current line.
' Input_file              ##Mentioning Input_file name here.

Вывод будет следующим.

a b c d
a h i j
a e f g

a q w e
a r r t
a y u i

a i o p
a j k l
a t y u
0 голосов
/ 20 сентября 2018

Поскольку он помечен linux, я предполагаю, что gawk доступно

awk -v FIELDWIDTHS='2 2 2 1' -v OFS= '{if($1=="  ")$1=p; else p=$1} 1' ip.txt
  • FIELDWIDTHS позволяет указать ширину каждого поля
  • 2 означает два символа, 1 означает один символ и т. д.
  • -v OFS= пустой OFS, поскольку разделитель полей является частью значений полей
  • if($1==" ")$1=p; else p=$1, если первое поле пустое (означает двапробелы в этом примере), присвойте ему ранее сохраненное значение


awk -v OFS='\t' 'NF==3{$1 = p OFS $1} NF==4{p=$1; $1=$1} 1' ip.txt

Это будет работать для изменяющихся пробелов между полями ввода и форматировать выходные данные, чтобы использовать вкладкув качестве разделителя полей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...