将偶数行转换为 linux/cli 中的列

Convert even rows to columns in linux/cli

我有一个类似于下面的数据集:

37  151 36  34  40  56  59  42  28  38  60
1   11  0   0   2   2   3   4   0   0   4
35  158 35  37  40  56  58  48  31  40  72
1   2   1   1   0   0   0   0   1   0   0
32  132 32  30  36  57  53  35  25  34  54
8   36  4   8   8   7   13  13  3   6   14
40  162 36  38  41  66  64  46  27  35  60
0   2   0   0   1   0   0   0   1   1   2
32  151 31  34  41  58  66  45  33  40  66
0   5   3   2   1   2   0   1   1   4   6

我想像这样将偶数行转换为偶数列:

37 1 151 11 36 0 34 0 40 2 56 2 59 3 42 4 28 0 38 0 60 4
35 1 158 2 35 1 37 1 40 0 56 0 58 0 48 0 31 1 40 0 72 0
32 8 132 36 32 4 30 8 36 8 57 7 53 13 35 13 25 3 34 6 54 14
40 0 162 2 36 0 38 0 41 1 66 0 64 0 46 0 27 1 35 1 60 2
32 0 151 5 31 3 34 2 41 1 58 2 66 0 45 1 33 1 40 4 66 6

基本上,我想将偶数行转换为偶数列,同时保留奇数行和奇数列。

您可以使用 awk 以直接的方式执行此操作,方法是将奇数行的每个字段保存在数组中,然后在每个偶数行的元素之间打印每个数组元素,例如

awk '
   FNR%2{for(i=1;i<=NF;i++)a[i]=$i; next} 
   {for(i=1;i<=NF;i++) printf " %3d %3d", a[i],$i; print ""}
' file

其中记录号(行)取模FNR确定odd/even,其中奇数,字段存储在a[]数组中,然后是下一行(even) 在每个字段打印在 a[].

中相应字段之后的位置打印

例子Use/Output

您可以根据需要调整输出间距。使用 file 中的数据,您将获得:

$ awk '
>    FNR%2{for(i=1;i<=NF;i++)a[i]=$i; next}
>    {for(i=1;i<=NF;i++) printf " %3d %3d", a[i],$i; print ""}
> ' file
  37   1 151  11  36   0  34   0  40   2  56   2  59   3  42   4  28   0  38   0  60   4
  35   1 158   2  35   1  37   1  40   0  56   0  58   0  48   0  31   1  40   0  72   0
  32   8 132  36  32   4  30   8  36   8  57   7  53  13  35  13  25   3  34   6  54  14
  40   0 162   2  36   0  38   0  41   1  66   0  64   0  46   0  27   1  35   1  60   2
  32   0 151   5  31   3  34   2  41   1  58   2  66   0  45   1  33   1  40   4  66   6

没有均匀的输出间距:

$ awk '
   FNR%2{for(i=1;i<=NF;i++)a[i]=$i; next}
   {for(i=1;i<=NF;i++) printf " %d %d", a[i],$i; print ""}
' file
 37 1 151 11 36 0 34 0 40 2 56 2 59 3 42 4 28 0 38 0 60 4
 35 1 158 2 35 1 37 1 40 0 56 0 58 0 48 0 31 1 40 0 72 0
 32 8 132 36 32 4 30 8 36 8 57 7 53 13 35 13 25 3 34 6 54 14
 40 0 162 2 36 0 38 0 41 1 66 0 64 0 46 0 27 1 35 1 60 2
 32 0 151 5 31 3 34 2 41 1 58 2 66 0 45 1 33 1 40 4 66 6