테이블이 있어요. 열 순서를 변경하면 안 됩니다. 그리고 이러한 가치는 보존되어야 한다.
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
됩니다 .
그런 다음 스크립트는 입력 파일의 탭으로 구분된 열을 하나씩 살펴보고 각 열에 대해 헤더를 읽고 다른 행을 뒤섞습니다. 그런 다음 임시 출력 파일에 헤더와 스크램블된 줄을 추가합니다.
마지막으로 출력에는 이제 각 줄의 시작 부분에 탭이 포함되어 있으므로 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