awk转置行,根据模式删除重复的列,然后第4列断开

awk转置行,根据模式删除重复的列,然后第4列断开,awk,pattern-matching,row,multiple-columns,transpose,Awk,Pattern Matching,Row,Multiple Columns,Transpose,嗨,我正在处理这个多行的转置 输入并将其转换为 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

嗨,我正在处理这个多行的转置 输入并将其转换为

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)被删除并仅保留一次,并且在每第四列上中断到下一行

我在这里死机了,代码在下面返回

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!=昵称
条件。如果这是真的,它将打印昵称和其余列(即
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()
}
开始{
昵称=“”
}
函数print_data(){

对于(i=5;i我已经在这个脚本上取得了一些成功:

您需要知道何时停止打印连续的昵称:这是
$2!=昵称
条件。如果这是真的,它将打印昵称和其余列(即
打印数据
函数)并“跳过”到文件中的下一行(即
下一个

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()
}
开始{
昵称=“”
}
函数print_data(){

对于(i=5;i请查看这个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

$

看看这个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

$

您好@customcommander,customcommander,谢谢,您能给我简要解释一下这些行吗?例如,如果我在昵称前再添加一列,您可以在哪里更改它,这将对我有帮助,br ya801谢谢,玩了一会儿,它可以在我想要的许多列上工作@customcommander,customcommander,谢谢,您能给我一个答案吗如果你在昵称前加上一个栏,那会对我有帮助,BR YA801谢谢你,玩了一点,它在很多栏里工作,我想考虑一下投票的答案。