linux - 用 n 步旋转文本文件中的行

我有一个包含数千行的文本文件,我需要旋转这些行。这是一个例子:

我的文件.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 作为参数并将旋转后的行输出到新文件。

感谢您的帮助。

最佳答案

使用headtail , 加上一些简单的 bash arithmetic expansion .您还需要 tacwc :

首先,为输入文件创建一个最小的可重现示例。设置 n - 从文件末尾到开头要旋转的行数:

n = 2
perl -le 'print "line$_" for 1..7' > in_file
cat in_file

打印:

line1
line2
line3
line4
line5
line6
line7

方法一:用tailhead旋转,加上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

方法二:用tailhead旋转,加上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

node.js - NodeJS Docker 当前与最新

java - 使用 Spring JPA/Hibernate 按不同值批量更新

python - 使用 Python 的双向方差分析

variables - 如何在 Pyomo 模型中设置决策变量的初始值

node.js - 即时将文件从 S3 移动到 AWS EFS

visual-studio - VS代码-OSS : Downloading files and f

google-cloud-platform - 接受 Google 帐户转移请求时如何解决消息 "T

python-3.x - 安装 github 子模块时,诗歌安装失败并显示 [CalledProce

tensorflow - 是否有 L-BFGS 的 tf.keras.optimizers 实现?