我想颠倒文本文件(或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
命令.tac
是cat
反过来的.例:
$ 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