使用awk翻转第一列和最后一列

时间:2014-03-23 22:33:45

标签: bash awk

#!/bin/bash
  awk '{
           a[i++] = $1;
           a2[k++] = $NF;
          }
         END{
           for(j = 1; j<=NR; j++){
           printf"%d ",a[NR-j];
                 for(m = 2; m<NF;m++){
                   printf"%d ",$m;
                }
          printf"%d\n", a2[NR-j];
          }
        }'

我正在尝试翻转任何大小矩阵中的第一列和最后一列。目前它正在翻转第一列和最后一列但打印最后一行的中间列值

4 个答案:

答案 0 :(得分:2)

要翻转每行(具有不同大小)的第一列和最后一列,您可以尝试类似:

[ ~]$ cat test.txt 
1 2 3 4 5
1 2 3
1 2 3 4 5 6
[ ~]$ awk '{tmp=$1; $1=$NF; $NF=tmp; print}' test.txt
5 2 3 4 1
3 2 1
6 2 3 4 5 1

答案 1 :(得分:1)

在AWK中,字段也可以出现在作业的左侧:

seq 20 | paste -s -d ' ' -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

seq 20 | paste -s -d ' ' - | awk '{ x=$1; $1=$NF; $NF=x; print }'
20 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1

答案 2 :(得分:1)

Awk的END部分用于处理之后,您已遍历整个文件。例如:

awk ' BEGIN { total = 0 }
      END   { print "The total of column 1 is " total}
      {
          total += $1
          print $0
      }'  file.txt

在这里,我有BEGINEND条款。 BEGIN子句在我的文件处理之前运行,并且基本上将变量total初始化为0.(不是必需的,但我想要某种示例)。

我处理完文件中的所有行后,END子句运行。它打印出我在每行读取时计算的total变量的数量。我的程序的主要部分(这是最后一个子句),只需将列$1添加到total并打印出该行。

您要做的是在您阅读该行时更改行打印的方式。您希望最后一列(无论是什么)打印为第一列,第一列打印为最后一列。 NF变量会告诉您您拥有的字段数量:

awk '{
    for ( count = 1; count <= NF; count++ ) {
        if ( count == 1 ) {
            printf $NF "  "
        }
        else if ( count == NF ) {
            print $1
            continue
        }
        else {
            printf $count "  "
        }
    }
}' test.txt

在这里,我只有我的主要条款。我有一个for循环从每行的第一个字段循环(请记住,每行都由我的awk语句处理。如果count为1,我在第一个字段上,打印最后一个字段($NF)。如果我的count等于该行上的字段数,则打印第一个字段({{1} })。否则,我打印出字段本身。

这不是可以制作的$1最紧凑的形式,但它很容易理解。

有效吗?

这是我的测试文件:

awk

这是输出:

one two three four five six
alpha beta gamma
bob carol ted alice
uno dos tres quatro cinco ses
alpha bravo charlie delta echo
apple banana carrot darren eggplant fennel

答案 3 :(得分:0)

当特定行消失时,awk不再记住其内容,除非您明确存储它们。因此,在END块中,$m表示最后一行中的第m个值,并且您没有将所有前面行的第m个值存储在任何位置。

看起来您必须将整个矩阵存储在内存中才能使其正常工作,或者以某种方式通过文件而不是一个来完成这项工作。