Unix-文件中行和列的循环移位

Unix-文件中行和列的循环移位,unix,awk,Unix,Awk,给定包含以下内容的文件: 1 2 3 4 5 6 7 8 a b c d e f g h circular_shift 2 <file> 是否有任何unix命令可用于循环移位行和列 我在找一些像说 循环移位-r 2(按2移位行)给出: a b c d e f g h 1 2 3 4 5 6 7 8 3 4 1 2 7 8 5 6 c d a b g h e f 及 循环移位-C2(将列移位2)以给出: a b c d e f g h 1 2 3 4 5 6 7 8 3 4

给定包含以下内容的文件:

1 2 3 4
5 6 7 8
a b c d
e f g h
circular_shift 2 <file>
是否有任何unix命令可用于循环移位行和列

我在找一些像说

循环移位-r 2
(按2移位行)给出:

a b c d
e f g h
1 2 3 4
5 6 7 8
3 4 1 2
7 8 5 6
c d a b
g h e f

循环移位-C2
(将列移位2)以给出:

a b c d
e f g h
1 2 3 4
5 6 7 8
3 4 1 2
7 8 5 6
c d a b
g h e f
谢谢

移动行 您可以使用
头部
尾部
和外壳:

function circular_shift() {
    n=$1
    file=$2
    tail -n +"$((n+1))" "$file"
    head -n "$n" "$file"
}
按如下方式调用函数:

1 2 3 4
5 6 7 8
a b c d
e f g h
circular_shift 2 <file>
现在试着打电话:

circular_shift 6 <file>
将其包装在shell函数中:

function column_shift() {
    n="$1"
    file="$2"
    awk -v n="$n" -f column-shift.awk "$file"
}

使用awk对
文件进行两次行移位处理:

$ awk -v r=2 'NR==FNR && FNR>r || NR>FNR && FNR<=r' file file
a b c d
e f g h
1 2 3 4
5 6 7 8
(由于我正在开会,几乎没有经过测试……至少在
c=0
时失败了)

@Vivek V K,试试: 用于将行向上移动到数字

awk -vcount=2 'NR>count{print;next} NR<=count{Q=Q?Q ORS $0:$0} END{print Q}'   Input_file

awk-vcount=2'NR>count{print;next}NR在
gawk中使用多维数组的另一种解决方案

循环移位

awk-vc=2-f循环_shift.awk文件

awk-vr=2-vc=2-f循环移位.awk文件

awk-vc=$1-vr=$2'
函数PrintReverse(){
如果(!R)返回
对于(i=1;i>=0;i--){

对于(j=1;j这很好!只需注意,这只适用于r@VivekVK不一样,不。它可能需要两个
用于
s。要使它在
r>NR
中工作,需要三次迭代。第一次从
NR%r
开始第二次打印,第三次从那里开始打印。
^1
不错!James
^1
很好地利用了这个。谢谢!
{for(i=1; i<=NF; ++i){d[NR][i]=$i}}
END{
    c=c%NF; r=r%NR
    for(i=1; i<=NR; ++i){
        nr = i + (i>r?0:NR) - r
        for(j=1; j<=NF; ++j){
            nc = j + (j>c?0:NF) - c
            printf d[nr][nc] (j!=NF?OFS:RS)
        }
    }
}
a b c d
e f g h
1 2 3 4
5 6 7 8
3 4 1 2
7 8 5 6
c d a b
g h e f
c d a b
g h e f
3 4 1 2
7 8 5 6
awk -v C=$1 -v R=$2 '
function PrintReverse () {
      if( ! R ) return

      for( i=1; i>=0; i--) {
         for( j=1; j<=R; j++) {
            #print "DEBUG:: i: "i " j:" j " i * R + j :" i * R + j  " lr:" lr
            print L[ i * R + j ]
            L[ i * R + j ] = ""
         }
      }
   }

   {
   if( C ) {
      # Reverse Column
      for ( i=1; i<=NF; i+=2*C) {
         for( j=0; j<C; j++) {
            #print "DEBUG:: i: "i " j:" j " NF:" NF
            tmp = $(i+j)
            $(i+j) = $(i+j+C)
            $(i+j+C) = tmp
            }
         }
      $1=$1
      }

   if ( R ) {
      # Line buffer
      lr = ( FNR - 1 ) % ( R * 2 ) + 1
      L[ lr] = $0
      }
    else print
   }

   lr >= ( R * 2) { PrintReverse() }

   END { if( lr < ( R * 2 )) PrintReverse() }
   ' YourFile