目前我正在使用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
相同,我们什么也不做(=立即跳到该行执行),只是让行计数器自动递增。NR
next
- 在第二遍(
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