如何为每行执行的操作在sed's //'替换字符串中插入随机字符串?

时间:2019-05-31 08:43:35

标签: bash shell random sed

此:

def average_time(file_path): df = pd.DataFrame(pd.read_excel(file_path)) test_names_list = collections.Counter(df.iloc[:, 0]) times_list = {} for test_name in test_names_list: times_list[test_name] = [] for row in range(df.shape[0]): if str(df.iloc[row, 0]) == test_name: times_list[test_name].append(get_sec(str(df.iloc[row, 5]))) print(test_name, str(dt.timedelta(seconds=mean(times_list[test_name]))))

或者这个:

echo " " | tr ' ' '\n' | sed "s|.*|$RANDOM|"

将打印5个数字的列表(空格用换行符替换,sed用$ RANDOM替换每行),而这5个数字都相同

echo "    " | tr ' ' '\n' | sed "s|.*|$(echo $RANDOM)|"

这是因为将$ RANDOM替换为随机值只会发生一次。

最简单,最短的方法是什么,最好仅使用sed来为每行实际打印一个不同随机数。即提供一些“辅助输入流”,这对于sed处理的每一行都是不同的?

我可以用xargs来做,但是我想知道是否有办法只用sed来做。

6 个答案:

答案 0 :(得分:1)

取决于您的sed版本,但是-

$: cat x
a
b
c
d
e

$: sed 's/.*/printf "%05d\n" $RANDOM/e' x
30181
30514
24742
28555
26267

e的意思是e xecute ,并生成一个子shell,因此请谨慎使用费用。

答案 1 :(得分:0)

如果您想要相同的随机数

random=$(cat /dev/urandom | tr -cd '0-9' | head -c 5)
echo -e "$random\n$random\n$random\n$random\n$random"

如果您每次都想要一个不同的号码。这里的问题是很难设置您获得多少个字符

echo -e "$RANDOM\n$RANDOM\n$RANDOM\n$RANDOM\n$RANDOM"

或更合逻辑地表示相同的数字

random=$(cat /dev/urandom | tr -cd '0-5' | head -c 8)
x=0
while (($x < 5)); do echo "$random";((x++));done

或更合逻辑地表示其他数字

x=0
while (($x < 5)); do random=$(cat /dev/urandom | tr -cd '0-5' | head -c 8); echo "$random";((x++));done

答案 2 :(得分:0)

问题:

最简单,最短的方法(最好是使用sed最好是使用em )为每行打印不同的随机数是什么?

答案:

echo "    " | tr ' ' '\n' | perl -pe 's|.*|int(rand(89999))+10000|e'

或简单地:

perl -e 'printf "%05s\n",int(rand(100000)) for (1..5)'

说明:

这使我无法理解为什么不使用Perl或任何更适合该工作的工具。在OP中,没有任何理由坚持使用sed,相反,这仅表示为偏好。

这同样使我无法理解为什么要进行替换以打印五个随机数。没有提供有关全局的详细信息,但这肯定使我感到好奇。

答案 3 :(得分:0)

这可能对您有用(GNU sed和Bash):

seq 5 | sed 's/.*/echo $RANDOM/e'

这将echo $RANDOM替换为1到5,并评估每一行。

GNU sed使用/bin/sh,它可能通过符号链接指向/bin/dash,在这种情况下,将找不到环境变量$RANDOM。解决此问题的方法有很多种,但最简单(尽管可能很危险)的可能是:

sudo ln -sf /bin/bash /bin/sh
# run sed
sudo ln -sf /bin/dash /bin/sh

另一个替代方案:

shuf -i 1-100000 -n 5

答案 4 :(得分:0)

不,仅使用sed不可能这样做,因为sed无法生成随机数。在您发布的示例中,甚至没有使用sed进行操作,而是在调用sed之前外壳生成了一个随机数。 sed看到的只是"s|.*|21590|"

如果要在任何UNIX盒的任何shell中使用标准工具来执行此操作,则可以使用任何awk来执行此操作:

$ echo "    " | tr ' ' '\n' | awk '{sub(/.*/,rand())}1'
0.924046
0.593909
0.306394
0.578941
0.740133

有关rand()的更多信息,请参见https://www.gnu.org/software/gawk/manual/gawk.html#Numeric-Functions,如果您有兴趣寻求awk解决方案,我可以提供C&V。

答案 5 :(得分:0)

我找到了以下解决方案:

$ seq 5 | sed "s/.*/date +%N | grep -o '[0-9][0-9][0-9][0-9][0-9]$'/e"
16794
76358
17143
60690
70506

它使用纳秒计时器的最后 5 个数字来生成一个合理的随机熵质量随机数。