将偶数行转换为 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
我有一个类似于下面的数据集:
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