繁体   English   中英

使用 Shell 脚本在文本文件中的特定行号之前添加内容

[英]Adding content before specific line number(s) in a text file using Shell Scripting

所以我有一个看起来像这样的文本文件:

a1
b1
c1 
a2 
b2 
c2
.
.
.

现在我想索引这个文本文件的每个组件,如下所示:

0:
a1
b1
c1
1:
a2
b2
c2
.
.
.

我尝试开发了几个 shell 脚本,但不幸的是无法实现上述目标。 如果有人能为我指出正确的方向,告诉我如何使用 shell 脚本执行上述任务,那就太好了。 谢谢!

PS:我是 macOS 用户(只是让你知道,因为 awk/sed 命令在 macOS 和 Linux 上的执行有点不同)

$ cat input
a1
b1
c1
a2
b2
c2
.
.
.
$ awk '/^a/{printf "%d:\n", counter++}1' input
0:
a1
b1
c1
1:
a2
b2
c2
.
.
.

或者:

awk '/^a/{print counter++ ":" }1' input ,但printf感觉更干净。

使用这个 Perl 单线,它依赖于每个组恰好有 3 行共享相同索引的假设:

echo 'a1 b1 c1 a2 b2 c2 a3 b3 c3' | xargs -n1 > in_file
perl -lpe '$i = (($. - 1) / 3); print "$i:" if ! (($. - 1) % 3);' in_file > out_file

out_file的内容:

0:
a1
b1
c1
1:
a2
b2
c2
2:
a3
b3
c3

Perl 一行代码使用这些命令行标志:
-e :告诉 Perl 查找内联代码,而不是在文件中。
-p :一次循环输入一行,默认情况下将其分配给$_ 在每次循环迭代后添加print $_
-l :在执行内联代码之前去除输入行分隔符(默认情况下在 *NIX 上为"\n" ),并在打印时去除 append。

$. :当前输入行号。

也可以看看:
perldoc perlrun :如何执行 Perl 解释器:命令行开关

在每个 Unix 框上的任何 shell 中使用任何 awk:

$ awk '{key=$0; gsub(/[^0-9]+/,"",key)} key != prev{print (key-1)":"} {print; prev=key}' file
0:
a1
b1
c1
1:
a2
b2
c2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM