如何使用 awk 在行前按降序添加序列号

如何使用 awk 在行前按降序添加序列号

目前我正在使用awk '{print NR,$0}' 此命令来打印文件的序列号。但如何按降序打印序列号呢?

电流输出:

1 abcd
2 abcd
3 abcd
4 abcd

期望的输出:

4 abcd
3 abcd
2 abcd
1 abcd

答案1

不使用awk而是使用可以让您避免编写自己的(更详细的)脚本的工具。

使用非标准tac实用程序以相反的顺序输出文件的行,并cat使用其非标准-n选项对行进行编号:

tac file | cat -n | tac

答案2

注意:此答案假设目标是“向下计数”行号,同时保持文本行的原始顺序。帖子的措辞和提供的示例在这方面含糊不清,因此这个答案可能无法解决OP的实际问题。

为了避免缓冲,双遍方法可能对大文件有益。它使用标准语法,因此应该具有相当的可移植性。

awk 'NR==FNR{next} {printf "%d %s\n",(NR-2*FNR+1),$0}' input_file input_file

这将处理文件两次(因此它作为参数给出两次):

  • 在第一遍中,每个文件行计数器与全局行计数器FNR相同,我们什么也不做(=立即跳到该行执行),只是让行计数器自动递增。NRnext
  • 在第二遍(FNR现在不同于NR)中,我们计算逆行数为NR(处理的总行数,即输入文件中的总行数加上当前行数)减去2倍FNR(一次将其减少到文件长度,还有一次实际倒数),加 1(否则我们将得到0最后一行的行号),并使用printf将其添加到该行的前面。

答案3

使用awk

$ awk '{ a[i++]=NR" "$0 } END { for (n=i-1;n>=0;) print a[n--] }' input_file

答案4

有以下示例输入:

one
two
three

如果您的输入文件足够小,可以容纳您当前拥有的可用内存量,并且您还想保留行的顺序,那么。

awk '{ data[NR]=$0 } 
END{ 
    for(recNr=NR; recNr>0; recNr--)
        print recNr, data[++c]
}' infile

输出:

3 one
2 two
1 three

或者如果您也想反转输入行的顺序,那么。

awk '{ data[NR]=$0 } 
END{ 
    for(recNr=NR; recNr>0; recNr--)
        print recNr, data[recNr]
}' infile

输出:

3 three
2 two
1 one

相关内容