我有一张桌子。列顺序不得更改。并应保留这些值。
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不起作用。
以下使用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句