如何用表格打乱文本文件表格

如何用表格打乱文本文件表格

我有一张桌子。不得更改列顺序。并且应该保留这些价值观。

Name    Age size    Code
Abel    10  S   A
Bjorn   20  M   B
Casimir 30  L   C
Dennis  40  XL  D

我不只是想打乱行,而是独立地打乱所有值。作为示例输出:

Name    Age size    Code
Casimir 20  M   D
Dennis  10  L   C
Bjorn   40  XL  A
Abel    30  S   B

所以 shuf 不起作用。

答案1

以下使用bashGNUshuf创建数据的随机版本。该脚本假定输入文件路径名在命令行上给出,并将在标准输出上输出结果。假设输入是制表符分隔的。

#!/bin/bash

file=$1

cols=$( awk -F '\t' '{ print NF; exit }' <$file )

result=$(mktemp)
tmpfile=$(mktemp)

trap 'rm -f "$result" "$tmpfile"' EXIT

for ((i = 1; i <= cols; ++i)); do
    cut -f "$i" <"$file" |
    { IFS= read -r header; printf '%s\n' "$header"; shuf; } |
    paste "$result" - >$tmpfile

    mv "$tmpfile" "$result"
done
sed 's/^[[:blank:]]//' <$result

该脚本首先计算输入数据中的列数。它通过简单地询问awk输入第一行上制表符分隔字段的数量来实现这一点。

然后,该脚本逐一遍历输入文件中以制表符分隔的列,并为每一列读取标题并打乱其他行。然后将标题和打乱的行添加到临时输出文件中。

最后,由于输出现在在每行开头包含一个选项卡,因此会对其进行过滤sed以删除这些选项卡。

运行示例:

$ ./script.sh file
Name    Age     size    Code
Dennis  20      L       B
Bjorn   30      S       C
Abel    40      XL      A
Casimir 10      M       D
$ ./script.sh file
Name    Age     size    Code
Bjorn   40      S       D
Abel    30      XL      C
Casimir 10      M       A
Dennis  20      L       B

相关内容