2 command-line bash text-processing
我有一个格式的文件
<string> <string> <string>
..
..
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 sed 用随机数据替换第三列字符串。第三列字符串长度固定,为48位
我能够使用 read 修复解决方案
while read a b c; do
echo $a $b $(cat /dev/urandom | tr -dc '0-1' | fold -w 48 | head -n 1)
done < input > output
Run Code Online (Sandbox Code Playgroud)
然而,循环过程也需要太长时间。我怎样才能用 sed 做到这一点。
cat /dev/urandom | tr -dc '0-1' 是一种非常缓慢的获取随机数的方法——你丢弃了很多数据,只是因为它没有解析为 ASCII 数字。
您可以使用od或hexdump将数据转换为数字,而不是awk替换第三个字段:
$ awk -v cmd="od -t u2 -A n /dev/urandom | tr -d ' \n' | fold -w 48" '{cmd | getline a; $3=a}1' foo
a b 544404963198532458179603539139474299576034345258
a b 288743886427692659230387417952036728563243415446
a b 862132599821016414678116482868514114597223157825
a b 033164829235119519053106724136729063192651002644
a b 344594724128550250448115260033862902855932105599
a b 312488113115218631189450762993316672549312384472
a b 536218132619476215470461793189974621744028599402
a b 312943765306550325469516346331872556359574159859
a b 530561655804530239462031928466172515137971221356
a b 295271911741933346066441964722122556255551414840
Run Code Online (Sandbox Code Playgroud)
od -t u2 -A n /dev/urandom | tr -d ' \n' | fold -w 48将随机数据转换为两字节的unsigned ints,然后我们使用tr从od的输出中删除空格。
awk非常适合基于列的文本处理。该<command> | getline方法允许您运行<command> 一次,然后在awk命令期间读取其输出。
比强制od输出为所需格式更简单的方法是使用hexdump:
hexdump -e '"%u"' /dev/urandom | fold -w 48
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
572 次 |
| 最近记录: |