テーブルがあります。列の順序を変更しないでください。そしてこれらの価値は保存されるべきです。
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
GNUを使用してshuf
データのランダムバージョンを生成します。スクリプトは、入力ファイルパス名がコマンドラインに提供され、結果を標準出力に出力すると仮定します。入力がタブで区切られているとします。
#!/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
です。
その後、スクリプトは入力ファイルのタブで区切られた列を1つずつ調べ、各列のヘッダーを読み取り、別の行を混乱させます。次に、一時出力ファイルにヘッダーとスクランブルされた行を追加します。
最後に、出力には各行の先頭にタブが含まれているため、これらの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