[英]Running loop number of times as per number of lines in the content of the text file ( Unix Shell Scripting )
[英]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。
$.
:当前输入行号。
在每个 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.