我有一张桌子。不得更改列顺序。并且应该保留这些价值观。
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
以下使用bash
GNUshuf
创建数据的随机版本。该脚本假定输入文件路径名在命令行上给出,并将在标准输出上输出结果。假设输入是制表符分隔的。
#!/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