테이블로 텍스트 파일 테이블을 뒤섞는 방법

테이블로 텍스트 파일 테이블을 뒤섞는 방법

테이블이 있어요. 열 순서를 변경하면 안 됩니다. 그리고 이러한 가치는 보존되어야 한다.

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됩니다 .

그런 다음 스크립트는 입력 파일의 탭으로 구분된 열을 하나씩 살펴보고 각 열에 대해 헤더를 읽고 다른 행을 뒤섞습니다. 그런 다음 임시 출력 파일에 헤더와 스크램블된 줄을 추가합니다.

마지막으로 출력에는 이제 각 줄의 시작 부분에 탭이 포함되어 있으므로 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

관련 정보