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

Viv*_*V K 2 unix awk

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

1 2 3 4
5 6 7 8
a b c d
e f g h
Run Code Online (Sandbox Code Playgroud)

是否有任何unix命令可用于循环移动行和列?

我在寻找像是这样的话,

circular_shift -r 2 <file> (换行2)给出:

a b c d
e f g h
1 2 3 4
5 6 7 8
Run Code Online (Sandbox Code Playgroud)

circular_shift -c 2 <file> (换列2)给出:

3 4 1 2
7 8 5 6
c d a b
g h e f
Run Code Online (Sandbox Code Playgroud)

谢谢!

Jam*_*own 6

使用awk进行行移位处理file两次:

$ 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
Run Code Online (Sandbox Code Playgroud)

基本上它会NR > r在第一次和NR <= r第二次打印记录.

编辑:有关记录和字段的版本:

$ awk -v r=1 -v c=1 '
NR==FNR && FNR>r || NR>FNR && FNR<=r {
    j=0;
    for(i=c+1;++j<=NF;i=(i<NF?i+1:1)){
        printf "%s%s",$i,(i==c?ORS:OFS)
    }
}
' foo foo
6 7 8 5
b c d a
f g h e
2 3 4 1
Run Code Online (Sandbox Code Playgroud)

(当我正在开会时,几乎没有经过考验......它至少失败了c=0)