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