我想要反转一个文本文件(或stdin)中的行顺序,同时保留每行的内容。
也就是说,例如,从以下内容开始:
foo
bar
baz
我想最终拥有
baz
bar
foo
有没有标准的UNIX命令行实用程序可以做到这一点?
我想要反转一个文本文件(或stdin)中的行顺序,同时保留每行的内容。
也就是说,例如,从以下内容开始:
foo
bar
baz
我想最终拥有
baz
bar
foo
有没有标准的UNIX命令行实用程序可以做到这一点?
我真的很喜欢"tail -r"的答案,但我最喜欢的gawk答案是....
gawk '{ L[n++] = $0 }
END { while(n--)
print L[n] }' file
mawk
测试过 - 可以正常工作,因此不是GNU awk特定的。+1 - Sergiy Kolodyazhnyyn++
can be replaced with NR
- karakfa最简单的方法是使用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
sed -i '1!G;h;$!d' filename
这种方式不需要创建临时文件,也不需要删除或重命名原始文件,但是可以达到相同的效果。例如:
$tac file > file2
$sed -i '1!G;h;$!d' file
$diff file file2
$
根据ephemient的答案,这个答案几乎满足了我的需求,但还有些许不同。
编辑 下面是生成一个随机排序的1到10的数字列表的代码:
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:使用 [::-1] 处理 sys.stdin
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]))")
awk '{arr[i++]=$0} END {while (i>0) print arr[--i] }' filename
此命令假设文件中不存在字符“~”。这在追溯到1961年的每个UNIX shell上都可以使用。或者类似于此的命令。rev | tr '\n' '~' | rev | tr '~' '\n'
cat foo.txt | rev | tr '\n' '~' | rev | tr '~' '\n' > bar.txt
- Kerry JohnsonC-x h
(选择整个文件),然后使用M-x reverse-region
。也适用于仅选择部分或行并将其反转。您可以在命令行上使用Perl:
perl -e 'my @b=(); while(<>) {push(@b, $_);}; print join("", reverse(@b));' orig > rev
tail -n20 file.txt | tac
man tail
, man tac
,而不是被喂到嘴里。+1 - Kaz
perl -e 'print reverse <>'
,但可能也适用于其他方法)。 - jakub.g