使用awk将某些列移动到末尾

使用awk将某些列移动到末尾,awk,Awk,我有一个以制表符分隔的文件,有1000列。我想重新排列,以便某些列必须移动到末尾 有人能帮我使用awk吗 输入示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 将第5、6、7、8列移到末尾。 输出: 重新排列两列的一种方法($5变为$20和$20变为$5)其余保持不变: $ awk '{x=$5; $5=$20; $20=x; print}' file.txt 对于4列: $ aw

我有一个以制表符分隔的文件,有1000列。我想重新排列,以便某些列必须移动到末尾

有人能帮我使用awk吗

输入示例:

1  2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20
将第5、6、7、8列移到末尾。 输出:


重新排列两列的一种方法(
$5
变为
$20
$20
变为
$5
)其余保持不变:

$ awk '{x=$5; $5=$20; $20=x; print}' file.txt
对于4列:

$ awk '{
    x=$5; $5=$20; $9=x;
    y=$9; $9=$10; $10=y;
    print
}' file.txt

这会将列1打印到
a
,然后将
b
打印到最后一列,然后将列
a+1
打印到
b-1

$ awk -v a=4 -v b=9 '{for (i=1;i<=NF;i+=i==a?b-a:1) {printf "%s\t",$i};for (i=a+1;i<b;i++) {printf "%s\t",$i};print""}' file
1       2       3       4       9       10      11      12      13      14      15      16
        17      18      19      20      5       6       7       8
+=
仅表示“添加到”。
i==a?b-a:1
是三元语句。它返回的值取决于
i==a
是真还是假。如果为true,则返回冒号前的值。如果为false,则返回冒号后的值

  • 对于(i=a+1;i我的方法:

    awk 'BEGIN{ f[5];f[6];f[7];f[8] } \
    { for(i=1;i<=NF;i++) if(!(i in f)) printf "%s\t", $i; \
    for(c in f) printf "%s\t", $c; printf "\n"} ' file
    
    awk'BEGIN{f[5];f[6];f[7];f[8]}\
    {for(i=1;iawk中的另一种方式
    使用最后N个字段切换最后A-B

    awk -vA=4 -vB=8 '{x=B-A;for(i=A;i<=B;i++){y=$i;$i=$(t=(NF-x--));$t=y}}1' file
    

    awk-vA=4-vB=8'{x=B-A;对于(i=A;i
    catfoo | awk'{print$1$2$3$4$9……}
    ,基本上。@MarcB从不将
    cat
    与能够读取数据的程序一起使用,比如
    awk
    awk'code'foo
    。@MarcB谢谢!!是的,可以这样做。但是正如我说的,我有数百列,无法按照你建议的方式指定所有列。我希望你明白我的意思。@user1779730你知道吗“我们必须更清楚。如果没有关于如何识别这些
    某些列的更多信息,我们无法帮助您编写代码来移动
    某些列
    。这些列之间是否故意存在不同数量的空白?如果是,应如何处理?谢谢!!它可以重新安排两个c!”列之间相互移动。但是,我的查询是按照最初的postAdded示例中的说明重新排列多个列,共4列,请按照逻辑移动更多列我对printf“%s”有一个小问题\n在代码中。我在一个python模块中使用此代码,该模块将%s视为字符串。是否有替代方法来替换printf语句中的“%s”?我尝试使用普通打印,但未能成功。是否可以help@user1779730没问题。请参阅更新,它不使用
    %
    符号,并避免使用
    printf
    awk -v a=4 -v b=9 '{out="";for (i=1;i<=NF;i+=i==a?b-a:1) out=out $i"\t";for (i=a+1;i<b;i++) out=out $i "\t";print out}' file
    
    awk 'BEGIN{ f[5];f[6];f[7];f[8] } \
    { for(i=1;i<=NF;i++) if(!(i in f)) printf "%s\t", $i; \
    for(c in f) printf "%s\t", $c; printf "\n"} ' file
    
    awk -vA=4 -vB=8 '{x=B-A;for(i=A;i<=B;i++){y=$i;$i=$(t=(NF-x--));$t=y}}1' file
    
    awk -vA=3 -vB=8 '{split($0,a," ");x=A++;while(x++<B)$x=a[NF-(B-x)];while(B++<NF)$B=a[A++]}1' file