每行重复多次

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)

  • awk 语句由条件和块组成,两者都是可选的,但必须存在。默认条件是“1”(真);默认块相当于`{print}`。所以语句`1` 意味着打印当前行缓冲区(`{print}`)。(`{print}` 和 `{print $0}` 基本相同,qed。) (3认同)
  • +1,如果是,你就赢了:) awk 中的 `1` 到底有什么作用?`print $0` 的简写? (2认同)

ter*_*don 25

  • 替代 perl:`perl -ne 'print(($_)x4)'`。另外,你应该在你的 bash 版本中引用 `$line`(在 echo 中)。 (4认同)

Hau*_*ing 5

sed -n '{p;p;p;p;}' file

awk '{print;print;print;print;}' file
Run Code Online (Sandbox Code Playgroud)


slm*_*slm 5

您可以在不需要sedperl或 的情况下执行此操作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循环
$ 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)