当前位置:  开发笔记 > 编程语言 > 正文

如何反转文件中的行顺序?

如何解决《如何反转文件中的行顺序?》经验,为你挑选了11个好方法。

我想颠倒文本文件(或stdin)中行的顺序,保留每行的内容.

所以,即从以下开始:

foo
bar
baz

我想结束

baz
bar
foo

是否有标准的UNIX命令行实用程序?



1> Mihai Limbăș..:

另外值得一提:( tac咳嗽,反向cat).部分的coreutils.

将一个文件翻转到另一个文件中

tac a.txt > b.txt


特别值得一提的是使用没有-r选项的尾部版本!(大多数Linux人都有GNU尾部,没有-r,所以我们有GNU tac).
如果你将OS X与自制软件一起使用,你可以使用`brew install coreutils`安装tac(默认情况下安装为`gtac`).
只是一个注释,因为人们之前已经提到了tac,但是Tac似乎没有安装在OS X上.并不是说在Perl中编写替代品并不困难,但我没有真正的替代品.
你可以从Fink获得OS X的GNU tac.您可能希望获得GNU尾部,因为它做了一些BSD尾部没有的东西.

2> Jason Cohen..:

BSD尾巴:

tail -r myfile.txt

参考:FreeBSD,NetBSD,OpenBSD和OS X手册页.


使用Unix命令"tac"(与cat相反)
请记住'-r'选项不符合POSIX标准.下面的sed和awk解决方案甚至可以在最恶劣的系统中运行.
刚在Ubuntu 12.04上试过这个,发现我的尾巴版本没有-r选项(8.13).请改用"tac"(参见Mihai的答案).
复选标记应在下方移至tac.尾部-r在Ubuntu 12/13,Fedora 20,Suse 11上失败.
答案当然应该提到这只是BSD,特别是因为OP要求"标准UNIX"实用程序.这不是GNU尾部所以它甚至不是事实上的标准.
虽然对某些人有用,但这并不能解决所提出的问题.即它不是"标准UNIX命令行实用程序".

3> ephemient..:

有着名的sed技巧:

# reverse order of lines (emulates "tac")
# bug/feature in HHsed v1.5 causes blank lines to be deleted
sed '1!G;h;$!d'               # method 1
sed -n '1!G;h;$p'             # method 2

(说明:在非初始行前加上保持缓冲区,交换行和保持缓冲区,在末尾打印出行)

或者(从更快的执行)来自awk单行:

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

如果你不记得了,

perl -e 'print reverse <>'

在具有GNU实用程序的系统上,其他答案更简单,但并非全世界都是GNU/Linux ...


我希望这个是接受的答案.coz sed总是可用的,但不是`tail -r`和tac.
来自同一个来源:awk'{a [i ++] = $ 0} END {for(j = i-1; j> = 0;)打印一个[j--]}'文件*sed和awk版本都可以工作我的busybox路由器.'tac'和'tail -r'没有.

4> DerMike..:

如果你正好在vim使用中

:g/^/m0


相关:[如何颠倒行的顺序?](http://vi.stackexchange.com/q/2105/467)在Vim SE
g表示"全局执行此操作.^表示"行的开头".m表示"将行移动到新行号.0是要移动到哪一行.0表示"在当前行1之前的文件顶部".所以:"查找具有开头的每一行,并将其移至第0行." 您找到第1行,并将其移至顶部.什么也没做.然后找到第2行并将其移到第1行上方,到达文件顶部.现在找到第3行并将***移到顶部.每行重复此操作.最后,您将最后一行移至顶部.当你完成后,你已经扭转了所有的路线.
如果您简短地解释了它的工作,我会投票赞成。
是的,我得到了那个,但我的意思是分解vim命令的各个部分正在做什么.我现在看看@kenorb链接的答案,它提供了解释.

5> DigitalRoss..:
$ (tac 2> /dev/null || tail -r)

试试tac,适用于Linux,如果不起作用tail -r,可以在BSD和OSX上运行.


@sage,如果`tac`不可用,则回退到`tail -r`.`tac`不符合POSIX标准.也不是`tail -r`.仍然不是万无一失,但这可以提高工作的可能性.
为什么不`tac myfile.txt` - 我错过了什么?
您需要进行适当的测试,以查看tac是否可用。如果`tac`可用,但RAM用完并在消耗大量输入流的过程中进行交换,会发生什么情况。它失败了,然后`tail -r`成功处理了剩余的流,给出了错误的结果。

6> 小智..:
tac 

例:

$ cat file1.txt
1
2
3
4
5

$ tac file1.txt
5
4
3
2
1



7> Yakir GIladi..:

在你的命令结束时: | tac

tac完全符合您的要求,它"将每个文件写入标准输出,最后一行写入."

tac与猫相反:-).


这应该是公认的答案.羞耻上面有这么多的选票.

8> 小智..:

请尝试以下命令:

grep -n "" myfile.txt | sort -r -n | gawk -F : "{ print $2 }"


为什么不使用"nl"代替grep -n?
@GoodPerson,默认情况下`nl`将无法为空行编号.`-ba`选项在某些系统上可用,不是通用的(虽然我希望它不会出现HP/UX),而`grep -n`将始终编号*每行*匹配(在这种情况为空)正则表达式.

9> konsolebox..:

Just Bash :)(4.0+)

function print_reversed {
    local lines i
    readarray -t lines

    for (( i = ${#lines[@]}; i--; )); do
        printf '%s\n' "${lines[i]}"
    done
}

print_reversed < file


+1为bash和O(n)中的答案,以及不使用递归(如果可以的话,为+3)

10> 小智..:

最简单的方法是使用该tac命令.taccat反过来的.例:

$ cat order.txt
roger shah 
armin van buuren
fpga vhdl arduino c++ java gridgain
$ tac order.txt > inverted_file.txt
$ cat inverted_file.txt
fpga vhdl arduino c++ java gridgain
armin van buuren
roger shah 



11> Tim Menzies..:

我真的很喜欢" 尾巴 "答案,但我最喜欢的gawk答案是....

gawk '{ L[n++] = $0 } 
  END { while(n--) 
        print L[n] }' file

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有