【问题标题】:AWK read file in reverse order and print specified columnsAWK 以相反的顺序读取文件并打印指定的列
【发布时间】:2020-02-04 18:52:14
【问题描述】:

是否可以使用一个 awk 命令以相反的顺序读取文件并仅打印指定的列? 例如有一个文本文件需要解析:

A1 1 ABC 7
B2 2 CBZ 8
C3 3 XVY 9

要以相反的顺序打印行,我使用以下命令:

awk '{a[i++]=$0}END{for(j=i-1;j>=0;j--)print a[j];}' file.txt

但我只需要打印 $1 和 $3 列吗?期望的输出:

C3 XVY
B2 CBZ
A1 ABC

当然可以通过多种方式完成,但目标是单个 awk 命令。

【问题讨论】:

  • 只要{a[i++] = $1 " " $3}{a[i++] = sprintf("%s %s", $1, $3)}
  • @WilliamPursell,谢谢它可以在 for 循环中完成吗?
  • 当然,使用split

标签: bash shell awk


【解决方案1】:

在您的命令中,您将整行 ($0) 存储在数组 a 中,只需稍作修改即可存储所需的列,如下所示:

awk '{a[i++]=$1FS$3}END{for(j=i-1;j>=0;j--)print a[j];}'
C3 XVY
B2 CBZ
A1 ABC

【讨论】:

  • 我知道你刚刚复制了 OP 尝试,但不需要 i,因为 NR 是内置的,并且 awk 数组从 1 开始,而不是从零开始:awk '{a[NR]=$1FS$3} END{for(j=NR;j>=1;j--)print a[j]}'
【解决方案2】:

如果您不介意使用其他命令,那么 tac + awk 就可以了:

tac file | awk '{print $1, $3}'

C3 XVY
B2 CBZ
A1 ABC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2011-11-09
    相关资源
    最近更新 更多