Форматирование вывода с использованием awk - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть файл со следующим содержанием:

A 28713.64                  27736.1000
B 9835.32
C 38548.96

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

Ожидаемый результат:

A 28713.64                  27736.1000
B 9835.32
C 38548.96                  27736.1000

Я пробовал ниже, но это не работает:

awk '{if ($1 == "C") ; print $1,$2,$3}' file_name

Любая помощьДобро пожаловать !!!

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

РЕДАКТИРОВАТЬ: В соответствии с комментарием OP OP ищет самую первую строку и ищет совпадение строки C в самой последней строке Input_file, если это так, то одинследует попробовать следующее.

awk '
FNR==1{
  value=$NF
  print
  next
}
prev{
  print prev
}
{
  prev=$0
  prev_first=$1
}
END{
  if(prev_first=="C"){
      print prev,value
  }
  else{
      print
  }
}'  file | column -t


Предполагая, что ваш фактический Input_file такой же, как показанные образцы, и вы хотите выбрать значение из 1-го столбца, значение которого A.

awk '$1=="A" && FNR==1{value=$NF} $1=="C"{print $0,value;next} 1' Input_file| column -t

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

A  28713.64  27736.1000
B  9835.32
C  38548.96  27736.1000
0 голосов
/ 22 февраля 2019

POSIX диктует, что " присваивание несуществующему полю (например, $ (NF + 2) = 5) должно увеличить значение NF; создать любые промежуточные поля с неинициализированным значением; вызвать значение $ 0.для пересчета, поля должны быть разделены значением OFS."

Итак ...

awk 'NR==1{x=$3} $1=="C"{$3=x} 1' input.txt

Обратите внимание, что вывод не отформатирован хорошо, но это, вероятно,случай с большинством решений здесь.Вы можете передать вывод через column, как предложил Равиндер.Или вы можете точно контролировать вещи, печатая свои данные с помощью printf.

awk 'NR==1{x=$3} $1=="C"{$3=x} {printf "%-2s%-26s%s\n",$1,$2,$3}' input.txt

Если ваши строки могут быть выражены в формате printf, вы сможете избежать непредсказуемости column -tи сохранить накладные расходы на трубу.

0 голосов
/ 22 февраля 2019

Это работает для данного примера:

awk 'NR==1{v=$3}$1=="C"{$0=$0 FS v}7' file|column -t

Если вы хотите добавить значение 3-го столбца из строки A в строку C, измените NR==1 на $1=="A"

Часть column -t предназначена только для красивого вывода.: -)

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