Yim*_*ong 23 sed awk perl text-processing
想让文件中的每一行重复固定次数。
例如,每行重复四次:
a
b
c
Run Code Online (Sandbox Code Playgroud)
变成:
a
a
a
a
b
b
b
b
c
c
c
c
Run Code Online (Sandbox Code Playgroud)
我已经进行了一些搜索,并且有很多问题和答案都是按照相反的方式进行的,例如将重复的行合并为单行,也许还有一些关于通过再次打印来加倍行的问题。
在 C 中这样做很容易,但我希望我对本地命令有更多的了解,这样我就不必一直求助于这些一次性的东西。
gle*_*man 40
我想知道这是否会变成一场高尔夫比赛:
sed 'p;p;p'
awk '1;1;1;1'
perl -lpE 'say;say;say' # if Paul McCartney and Michael Jackson were hackers...
Run Code Online (Sandbox Code Playgroud)
解释:
sed 的p命令是打印当前行。默认行为是在移动到下一行之前打印当前行(这就是为什么 sed 必须-n允许您将其关闭)。一些较旧的 sed 没有分号(我认为),因此您可能必须这样做sed -e p -e p -e p
awk 与condition {action}成对一起工作。如果省略该操作,则默认为在条件返回 true 时打印当前行。awk 与许多类似 C 的语言一样,将其1视为 true。(为了完整起见,如果省略条件,将对每条记录执行该操作。)
许多 perl 函数利用了“默认”变量。这个单行相当于(在 perl 5.16 上):
$ perl -MO=Deparse -lpE 'say;say;say'
BEGIN { $/ = "\n"; $\ = "\n"; }
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
say $_;
say $_;
say $_;
}
continue {
die "-p destination: $!\n" unless print $_;
}
Run Code Online (Sandbox Code Playgroud)
ter*_*don 25
珀尔:
perl -ne 'for$i(0..3){print}' file
Run Code Online (Sandbox Code Playgroud)
我必须添加@derobert作为评论发布的这个,因为它很酷:
perl -ne 'print "$_" x4'
Run Code Online (Sandbox Code Playgroud)awk 和变体:
awk '{for(i=0;i<4;i++)print}' file
Run Code Online (Sandbox Code Playgroud)bash
while read line; do for i in {1..4}; do echo "$line"; done; done < file
Run Code Online (Sandbox Code Playgroud)sed -n '{p;p;p;p;}' file
awk '{print;print;print;print;}' file
Run Code Online (Sandbox Code Playgroud)
您可以在不需要sed、perl或 的情况下执行此操作awk。
$ for i in `cat <file>` ; do seq <#> <#> | xargs -i -- echo $i ; done
Run Code Online (Sandbox Code Playgroud)
或使用 while 循环:
$ while read i ; do seq <#> <#> | xargs -i -- echo $i ; done < <file>
Run Code Online (Sandbox Code Playgroud)
$ for i in `cat sample.txt` ; do seq 1 3 | xargs -i -- echo $i ; done
a
a
a
b
b
b
c
c
c
Run Code Online (Sandbox Code Playgroud)
while 循环
$ while read i; do seq 1 2| xargs -i -- echo $i;done < sample.txt
a
a
b
b
c
c
Run Code Online (Sandbox Code Playgroud)