我怎样才能扭转文件中的行的顺序?

我想倒转文本文件(或标准input)中的行的顺序,保留每行的内容。

所以,即从以下开始:

foo bar baz 

我想结束

 baz bar foo 

有没有一个标准的UNIX命令行工具?

BSD尾巴:

 tail -r myfile.txt 

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

另外值得一提的是,TAC( cat ,阿姆, cat反向)。 部分coreutils 。

翻转一个文件到另一个

 tac a.txt > b.txt 

有一个众所周知的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 …

如果你碰巧在vim使用

 :g/^/m0 
 $ (tac 2> /dev/null || tail -r) 

尝试tac ,它适用于Linux,如果这不起作用使用tail -r ,它适用于BSD和OSX。

尝试以下命令:

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

只是打击:)(4.0+)

 function print_reversed { readarray -t LINES for (( I = ${#LINES[@]}; I; )); do printf '%s\n' "${LINES[--I]}" done } print_reversed < file 

最简单的方法是使用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 

我真的很喜欢“ tail -r ”的回答,但是我最喜欢的gawk答案是…

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

例:

 $ cat file1.txt 1 2 3 4 5 $ tac file1.txt 5 4 3 2 1 

编辑下面的从1到10生成随机sorting的数字列表:

 seq 1 10 | sort -R | tee /tmp/lst |cat <(cat /tmp/lst) <(echo '-------') **...** 

在那里用实际的命令代替点,这个命令颠倒了列表

TAC

 seq 1 10 | sort -R | tee /tmp/lst |cat <(cat /tmp/lst) <(echo '-------') \ <(tac) 

python:在sys.stdin上使用[:: – 1]

 seq 1 10 | sort -R | tee /tmp/lst |cat <(cat /tmp/lst) <(echo '-------') \ <(python -c "import sys; print(''.join(([line for line in sys.stdin])[::-1]))") 

最佳解决scheme

 tail -n20 file.txt | tac 

对于可能在shell脚本中使用tac交叉操作系统(即OSX,Linux)解决scheme,可以像上面提到的那样使用自制软件,那么只需要像以下这样的tac:

 brew install coreutils echo "alias tac='gtac'" >> ~/.bash_aliases (or wherever you load aliases) source ~/.bash_aliases tac myfile.txt 

我有同样的问题,但我也希望第一行(标题)留在上面。 所以我需要用awk的力量

 cat dax-weekly.csv | awk '1 { last = NR; line[last] = $0; } END { print line[1]; for (i = last; i > 1; i--) { print line[i]; } }' 

PS也适用于cygwin或gitbash

 sort -r < filename 

要么

 rev < filename