awk транспонирует строки с удалением повторяющегося столбца на основе шаблона с 4-м разрывом столбца после - PullRequest
0 голосов
/ 06 декабря 2018

привет, я в процессе, транспонирую этот многострочный ввод и транспонирую их в

nickname jeff site A site_out out 9C:02:24
nickname jeff site A site_in in 9C:02:24
nickname jeff site A in DOOR_SECT_X1 68:01:40
nickname jeff site A in DOOR_SECT_A1 68:01:10
nickname david site B site_in in EA:A7:D3
nickname david site B in EXT_MAT-G 80:16:7B
nickname martin site C in EXT_MAT-H 80:16:7B
nickname martin site C in ARR_N1D 68:01:10
nickname martin site C in ARR_N2D 68:01:10
nickname geoff site A site_out out 00:C9:AB
nickname geoff site A site_in in 00:C9:AB
nickname geoff site A in DEF_DOOR_ARR 80:07:E6

этот вывод

nickname jeff site A 
site_out out 9C:02:24
site_in in 9C:02:24
in DOOR_SECT_X1 68:01:40
in DOOR_SECT_A1 68:01:10
nickname david site B 
site_in in EA:A7:D3
in EXT_MAT-G 80:16:7B
nickname martin site C 
in EXT_MAT-H 80:16:7B
in ARR_N1D 68:01:10
in ARR_N2D 68:01:10
nickname geoff site A 
site_out out 00:C9:AB
site_in in 00:C9:AB
in DEF_DOOR_ARR 80:07:E6

, где дублируется "ник" вместе со вторым столбцом, например, martin /geoff удаляется и сохраняется только один раз, и в каждом 4-м столбце делается разрыв до следующей строки

Я застрял здесь с этим кодом, возвращающимся ниже

awk '{k=$1 FS $2 FS$3 FS$4 FS; a[k]=a[k] FS $NF}
   END {for(k in a) print k  "\n" a[k]}' 

nickname david site B
 EA:A7:D3 80:16:7B
nickname geoff site A
 00:C9:AB 00:C9:AB 80:07:E6
nickname martin site C
 80:16:7B 68:01:10 68:01:10
nickname jeff site A
 9C:02:24 9C:02:24 68:01:40 68:01:10

спасибо за подсказки, как двигаться сэто

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Проверьте этот Perl однострочник

$ cat ya801.txt
nickname jeff site A site_out out 9C:02:24
nickname jeff site A site_in in 9C:02:24
nickname jeff site A in DOOR_SECT_X1 68:01:40
nickname jeff site A in DOOR_SECT_A1 68:01:10
nickname david site B site_in in EA:A7:D3
nickname david site B in EXT_MAT-G 80:16:7B
nickname martin site C in EXT_MAT-H 80:16:7B
nickname martin site C in ARR_N1D 68:01:10
nickname martin site C in ARR_N2D 68:01:10
nickname geoff site A site_out out 00:C9:AB
nickname geoff site A site_in in 00:C9:AB
nickname geoff site A in DEF_DOOR_ARR 80:07:E6

$ perl -lane ' $y=join(" ",@F[0..3]) ; $z=join(" ",@F[4..$#F]); if ($x ne $y) { print "$y\n$z";$x=$y } else { print "$z";} ' ya801.txt
nickname jeff site A
site_out out 9C:02:24
site_in in 9C:02:24
in DOOR_SECT_X1 68:01:40
in DOOR_SECT_A1 68:01:10
nickname david site B
site_in in EA:A7:D3
in EXT_MAT-G 80:16:7B
nickname martin site C
in EXT_MAT-H 80:16:7B
in ARR_N1D 68:01:10
in ARR_N2D 68:01:10
nickname geoff site A
site_out out 00:C9:AB
site_in in 00:C9:AB
in DEF_DOOR_ARR 80:07:E6

$
0 голосов
/ 06 декабря 2018

У меня был некоторый успех с этим сценарием:

Вам необходимо знать, когда прекратить печатать последовательные псевдонимы: это условие $2 != nickname.Когда это так, он печатает псевдоним и оставшиеся столбцы (это функция print_data) и «пропускает» следующую строку в файле (это next)

Функция print_data печатает всеостальные столбцы после псевдонима.Если вы добавляете больше столбцов в конце строки, вам не нужно изменять этот скрипт.

BEGIN {
  nickname = ""
}

function print_data() {
  for (i=5; i<=NF; i++) {
    printf "%s ", $i
  }
  print ""
}

# change "$2" if you add more column before nickname
$2 != nickname {
  nickname = $2
  print $1, $2, $3, $4
  print_data()
  next
}

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