我刚刚意识到我可以解决这个问题通过将行号从 1, 2, 3,...,n 反转为 n, n-1, ..., 3,2,1,然后使用与之前相同的逻辑。所以我想知道如何反转行的顺序?
答案1
tac
(cat
向后,也包含在coreutils
)将以cat
相反的顺序排列文件:
$ cat /tmp/test
One
Two
Three
$ tac /tmp/test
Three
Two
One
(对于您提到的特定问题,解决方案比反转整个文件更好,这样您就可以追加一个文件并再次反转整个文件)
答案2
对于您的特定问题,这不是解决问题的最有效方法,但是,您可以使用以下任何一种方法来打印具有相反顺序的行的文件,并具有不同程度的可移植性(tac
例如,默认情况下不包含许多 Unix):
sed '1!G;h;$!d' [file]
awk '{f[n=NR]=$0}END{for(i=n;i>0;i--)print f[i]}' [file]
perl -e 'print reverse<>' [file]
tac [file]
在我的系统上,最快的是tac
,经以下测试:
$ printf '%s\n' {a..z}{a..z}{a..z} > foo
$ time sed '1!G;h;$!d' foo > /dev/null 2>&1
real 0m0.582s
user 0m0.544s
sys 0m0.012s
$ time awk '{f[n=NR]=$0}END{for(i=n;i>0;i--)print f[i]}' foo > /dev/null 2>&1
real 0m0.060s
user 0m0.052s
sys 0m0.008s
$ time perl -e 'print reverse<>' foo > /dev/null 2>&1
real 0m0.021s
user 0m0.016s
sys 0m0.004s
$ time tac foo > /dev/null 2>&1
real 0m0.003s
user 0m0.004s
sys 0m0.000s
...所以如果你有tac
,请使用它,否则,请使用perl
或awk
。
答案3
这tac
公用事业逆转线路。这是cat
相反的。
答案4
GNU 实用程序(Linux、Cygwin)和 BusyBox 具有tac
可反转文本文件中行的顺序的命令。
在没有 的系统上tac
,您可以通过标准命令来操作它。克里斯·唐的回答展示了通过将文件完全存储在内存中来实现此目的的几种方法。对于非常大的文件,在大多数 unice 上都可以工作且不会造成影响的方法是进行sort
反转。这对于中等大小的文件来说效率不高,但排序实现通常可以处理大于可用内存的文件。
nl | sort -nr | sed 's/.*\t//'
(替换\t
为文字制表符。)
正如已经迈克尔·姆罗泽克指出,反转行是将数据添加到文件的糟糕方法。该方法很难理解,并且需要做很多额外的工作。