我有一个包含数千行的文本文件,我需要旋转这些行。这是一个例子:
我的文件.txt
:
line1
line2
line3
line4
line5
line6
line7
我想用 n
步旋转线条。例如,如果 n = 2
。 line1 移动到 line3,line2 移动到 line4,line3 移动到 line 5,... line6 移动到 line1,line7 移动到 line2。所以输出应该是:
line6
line7
line1
line2
line3
line4
line5
也许我可以使用 Python 读取文件,旋转列表,然后保存到另一个文件。我想知道是否已经有用于此目的的命令行实用程序?它应该将文件名和 n
作为参数并将旋转后的行输出到新文件。
感谢您的帮助。
最佳答案
使用head
和 tail
, 加上一些简单的 bash arithmetic expansion .您还需要 tac
或 wc
:
首先,为输入文件创建一个最小的可重现示例。设置 n
- 从文件末尾到开头要旋转的行数:
n = 2
perl -le 'print "line$_" for 1..7' > in_file
cat in_file
打印:
line1
line2
line3
line4
line5
line6
line7
方法一:用tail
和head
旋转,加上wc
。
这比方法 2 稍微简单一些,并使用 wc -l ... - $n
计算 head
打印的行数。我更喜欢这种方法,因为程序员的意图在这里更明确。它也更快,请参阅下面的基准测试。
( tail -n $n in_file ; head -n $(( $( wc -l <in_file ) - $n )) in_file ) > out_file
打印:
line6
line7
line1
line2
line3
line4
line5
方法二:用tail
和head
旋转,加上tac
。
这里,
tac
: 将行以相反的顺序写入 STDOUT,
tail -n +3
:从第 3 行开始,从原始文件的末尾开始,以相反的顺序写入上述行(因此不写入第 1-2 行),
tac
: 总共使用了两次tac
,将行的倒序颠倒过来,以便按照原来的顺序写行。
( tail -n $n in_file ; tac in_file | tail -n +$(( $n+1 )) | tac ) > out_file
基准:
使用 wc
的方法 1 比使用 tac
的方法 2 快得多:
perl -le 'print "line$_" for 1..1e7' > in_file
n=2
for i in `seq 1 10` ; do
( time ( tail -n $n in_file ; head -n $(( $( wc -l <in_file ) - $n )) in_file ) > out_file ) 2>&1 | grep real
done
打印:
real 0m0.539s
real 0m0.538s
real 0m0.545s
real 0m0.566s
real 0m0.540s
real 0m0.532s
real 0m0.561s
real 0m0.534s
real 0m0.530s
real 0m0.520s
for i in `seq 1 10` ; do
( time ( tail -n $n in_file ; tac in_file | tail -n +$(( $n+1 )) | tac ) > out_file ) 2>&1 | grep real
done
打印:
real 0m0.855s
real 0m0.884s
real 0m0.916s
real 0m0.829s
real 0m0.838s
real 0m0.873s
real 0m0.877s
real 0m0.862s
real 0m0.835s
real 0m0.867s
我使用装有 macOS v.10.14.6 的 MacBook Pro 运行此程序,运行:
bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
https://stackoverflow.com/questions/63872136/
相关文章:
github - 最初发布一个github包显示 "Username must not be nul
java - 使用 Spring JPA/Hibernate 按不同值批量更新
variables - 如何在 Pyomo 模型中设置决策变量的初始值
node.js - 即时将文件从 S3 移动到 AWS EFS
visual-studio - VS代码-OSS : Downloading files and f
google-cloud-platform - 接受 Google 帐户转移请求时如何解决消息 "T