我想要反转一个文本文件(或stdin)中的行顺序,同时保留每行的内容。
也就是说,例如,从以下内容开始:
foo
bar
baz
我想最终拥有
baz
bar
foo
有没有标准的UNIX命令行实用程序可以做到这一点?
我想要反转一个文本文件(或stdin)中的行顺序,同时保留每行的内容。
也就是说,例如,从以下内容开始:
foo
bar
baz
我想最终拥有
baz
bar
foo
有没有标准的UNIX命令行实用程序可以做到这一点?
echo -n "abc\ndee" > test; tac test
。 - CMCDragonkai这里有一个众所周知的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一行命令)from the awk one-liners:
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file*
perl -e 'print reverse <>'
在使用GNU工具的系统上,其他答案更简单,但并非所有世界都是GNU/Linux...
tac
应该能够处理不适合放在内存中的任意大文件(但行长度仍受限制)。目前还不清楚 sed
解决方案是否适用于这样的文件。 - jfssed
版本。至少我知道怎么用perl
和awk
(还有其他答案,但我不想下载东西,而且我也不是在Linux系统上)。 - undefined在您的命令结尾处加上:| tac
tac正好做您所要求的事情,“将每个文件按最后一行优先写入标准输出”。
tac是cat的反义词 :-).
tac
命令的价值,这对于可能会搜索相同主题的新用户非常有用。 - Nic3500tac 文件名.扩展名
(相当于 cat 文件名.扩展名
的反向操作)即可。 - Andreas Huttenrauch如果你恰好在使用vim
:g/^/m0
Explanation来自@Ronopolis:
g
表示“全局执行”。
^
表示“行首”。
m
表示“移动到新的行号”,0
表示要移动到哪一行。
0
表示“文件顶部,在当前行1之前”。
因此:“查找每一行的开头,并将其移到第0行。”
你找到第1行,将其移到顶部。 没有任何变化。 然后找到第2行并将其移动到第1行上面,即文件顶部。 现在找到第3行并将其移动到顶部。 对于每一行都重复此操作。 最后,将最后一行移至顶部。 完成后,您已经颠倒了所有行。
tac <file_name>
例子:
$ cat file1.txt
1
2
3
4
5
$ tac file1.txt
5
4
3
2
1
$ (tac 2> /dev/null || tail -r)
尝试使用在Linux上可用的tac
,如果不起作用,请使用在BSD和OSX上可用的tail -r
。
tac
不可用,就需要退而使用tail -r
。 tac
不符合POSIX标准,tail -r
也是如此。虽然仍不完美,但这可以提高事情的成功率。 - slowpoisontac
是否可用。如果tac
可用,但在消耗巨大的输入流的过程中耗尽了RAM和交换空间,会发生什么情况?它会失败,然后tail -r
成功处理剩余的流并给出不正确的结果。 - mc0ebrew install coreutils
并使用 gtac
替换 tac
,如果您希望将其作为别名添加到 gtac
中,例如,如果您想要一个跨平台(Linux、OSX)使用它的shell脚本。 - lacostenycoder请尝试以下命令:
grep -n "" myfile.txt | sort -r -n | gawk -F : "{ print $2 }"
sed 's/^[0-9]*://g'
。 - bng44270nl
命令无法给空行编号。一些系统支持 -ba
选项,但不是所有系统都支持(比如 HP/UX 系统)。而 grep -n
命令则总是会给匹配的每一行加上行号,包括空行(在本例中)。 - ghoticut -d: -f2-
代替 gawk。 - Alexander Stumpf仅限 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
printf'%s\n'
而不是echo
。 - mtraceur对于跨操作系统(如OSX,Linux)的解决方案,可能会在shell脚本中使用tac
,像其他人一样使用homebrew,然后像这样别名tac:
安装lib
对于MacOS
brew install coreutils
对于linux debian操作系统
sudo apt-get update
sudo apt-get install coreutils
然后添加别名
echo "alias tac='gtac'" >> ~/.bash_aliases (or wherever you load aliases)
source ~/.bash_aliases
tac myfile.txt
perl -e 'print reverse <>'
,但可能也适用于其他方法)。 - jakub.g