Shell

我怎樣才能打亂一個文本文件表,一個表

  • November 15, 2018

我有一張桌子。不得更改列順序。並且應該保留這些值。

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

引用自:https://unix.stackexchange.com/questions/481895