打乱字符串中的单词

Vla*_*ecs 2 linux awk text-processing

我有一个带有换行符分隔字符串的文本文件。我的问题是按如下方式处理每一行:通过使用空格作为分隔符来打乱标记的顺序。

例如:

输入: A B C

输出: C A B

重复运行命令/脚本当然应该提供不同的顺序。

我当前的解决方案(对于单个文本行):

$ cat <file> | tr " " "\n" | shuf | tr "\n" " "

是否有一个不错的(更好的)命令行组合来处理多行文本文件?

Sté*_*las 6

POSIXly,您可以awk相对有效地完成它(当然比shuf为每一行输入运行至少一个 GNU实用程序更有效),如下所示:

awk '
  BEGIN {srand()}
  {
    for (i = 1; i <= NF; i++) {
      r = int(rand() * NF) + 1
      x = $r; $r = $i; $i = x
    }
    print
  }' < your-file
Run Code Online (Sandbox Code Playgroud)

(请注意,在大多数awk实现中,在同一秒内运行相同的命令两次可能会为您提供与使用的默认随机种子相同的结果,因为srand()通常基于当前的纪元时间(以秒为单位))。