如何反转文本文件的行?
-
03-07-2019 - |
题
我正在编写一个需要反转文本文件行的小shell脚本。是否有标准的过滤器命令来执行此类操作?
我的具体应用是我得到一个Git提交标识符列表,我想以相反的顺序处理它们:
git log --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1 | reverse
我提出的最好的方法是实现 reverse
,如下所示:
... | cat -b | sort -rn | cut -f2-
这使用 cat
对每一行进行编号,然后 sort
以降序的数字顺序对它们进行排序(最终反转整个文件),然后 cut
删除不需要的行号。
以上适用于我的应用程序,但在一般情况下可能会失败,因为 cat -b
仅对非空行进行编号。
有更好,更通用的方法吗?
解决方案
在 GNU coreutils 中,有 tac(1)
其他提示
答案不是42,而是 tac
。
编辑:使用 sed
sed 'x;1!H;$!d;x'
甚至更长
perl -e'print reverse<>'
有一个标准命令用于您的目的:
tail -r file.txt
以相反的顺序打印file.txt的行!
cat -b只编号非空行&quot;
,点击 如果那是你想要避免的唯一问题,那么为什么不使用“cat -n”呢?编号所有行?
: "@(#)$Id: reverse.sh,v 1.2 1997/06/02 21:45:00 johnl Exp <*>quot;
#
# Reverse the order of the lines in each file
awk ' { printf("%d:%s\n", NR, <*>);}' $* |
sort -t: +0nr -1 |
sed 's/^[0-9][0-9]*://'
对我来说就像一个魅力......
与上面的 sed 示例类似,使用 perl - 可能更难忘(取决于您的大脑如何连线):
perl -e 'print reverse <>'
在这种情况下,只需使用 - reverse
:
$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
rev <name of your text file.txt>
你甚至可以这样做:
echo <whatever you want to type>|rev
awk '{a[i++]=<*>}END{for(;i-->0;)print a[i]}'
比 sed
更快,并且与openwrt等嵌入设备兼容。
不隶属于 StackOverflow