как использовать awk для фильтрации новой строки в качестве разделителя записей и разделителя полей - PullRequest
2 голосов
/ 04 февраля 2020

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

Field1

   UNIX - System V

Field2

   32 bit

Field3

   No

здесь оператор поля - двойная строка, а оператор записи - также двойная строка. Я хочу выводить как:

Field1  UNIX - System V
Field2 32 bit

При написании следующей команды:

awk 'BEGIN{ FS="\n"; RS="\n\n"} {print $1 $2}' ctemp.txt

Я не получаю желаемый вывод.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020
$ awk 'NF{printf "%s%s", $0, ((++c)%2 ? OFS : ORS)}' file
Field1    UNIX - System V
Field2    32 bit
Field3    No
1 голос
/ 04 февраля 2020

1-е решение: Не могли бы вы попробовать следующее, протестировано с предоставленными образцами и написано с GNU awk.

awk -v FS="\n" -v RS="^$" '{for(i=1;i<=NF;i+=4){print $i,$(i+2)}}' Input_file


2-е решение: ИЛИ, приведенное выше, НЕ будет иметь дело с пробелами, начинающимися в начале строк, в случае, если вы хотите удалить те пробелы, которые были у нас раньше (UNIX - Система V), затем попробуйте следующее.

awk -v FS="\n" -v RS="^$" '
BEGIN{
  OFS="\t"
}
{
  for(i=1;i<=NF;i+=4){
    sub(/^ +/,"",$i)
    sub(/^ +/,"",$(i+2))
  print $i,$(i+2)
  }
}
'  Input_file


3-е решение: Должно работать в NON GNU awk, протестировано и написано с предоставленными образцами по ОП.

awk '
value==""{
  value=$0
  next
}
NF && value{
  sub(/^ +/,"")
  print value,$0
  value=""
}
'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...