gpt4 book ai didi

bash - 在标记之间洗牌文件的各个部分

转载 作者:行者123 更新时间:2023-11-29 09:19:55 25 4
gpt4 key购买 nike

我有这样的文件:

asdasadsdasdas
dasdasdasdasd
asdas
dasd
asdas
das
das
das
das
das
#SHUFFLE_MARK_START
das
d
das
das
dasd
asd
asdas
das
das
afs
sf
#SHUFFLE_MARK_END
fas
fas
fas
fas
fas
fas
fas
fas

我只想随机播放两个标记之间的部分文件 - #SHUFFLE_MARK_START#SHUFFLE_MARK_END,随机播放标记可以是我想要的任何字符串,它们只需要是唯一的filewise,有什么想法如何在 bash 中做到这一点以使其高效吗?

我已经尝试通过做类似的事情来做到这一点

cat file | grep -P '.+#SHUFFLE_MARK_START' > start
cat file | grep -P '#SHUFFLE_MARK_START.+#SHUFFLE_MARK_FINISH' | shuff | > middle
cat file | grep -P '#SHUFFLE_MARK_FINISH.+' > end
echo start middle end > shuffled

但是对于大文件来说它很慢,上面的命令可能有点错误,因为我是凭内存输入它们只是为了展示想法

最佳答案

这是执行此操作的 perl 脚本:

#!/usr/bin/perl
# Usage: foo.pl input.txt > output.txt
# or
# foo.pl < input.txt > output.txt
use warnings;
use strict;
use List::Util qw/shuffle/;
my $in_block = 0;
my @lines;
while (<>) {
if (/#SHUFFLE_MARK_START/) {
print;
$in_block = 1;
} elsif (/#SHUFFLE_MARK_END/) {
print shuffle(@lines);
print;
$in_block = 0;
@lines = ();
} elsif ($in_block == 0) {
print;
} else {
push @lines, $_;
}
}

(如果您不想包含 #SHUFFLE_MARK_START 等行,请删除相应的 print; 行)

关于bash - 在标记之间洗牌文件的各个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53091312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com