テーブルにテキストファイルテーブルを混在させる方法

テーブルにテキストファイルテーブルを混在させる方法

テーブルがあります。列の順序を変更しないでください。そしてこれらの価値は保存されるべきです。

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

以下は、bashGNUを使用して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

関連情報