Shell
我怎樣才能打亂一個文本文件表,一個表
我有一張桌子。不得更改列順序。並且應該保留這些值。
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