我想创建一个随机混乱大型csv文件的行和列的脚本。例如,对于初始文件 f.csv :
a, b, c ,d
e, f, g, h
i, j, k, l
首先,我们将行重新排列以获得 f1.csv :
e, f, g, h
a, b, c ,d
i, j, k, l
然后,我们将列 f2.csv :
洗牌g, e, h, f
c, a, d, b
k, i, l, j
为了对行进行随机播放,我们可以使用here:
awk 'BEGIN{srand() }
{ lines[++d]=$0 }
END{
while (1){
if (e==d) {break}
RANDOM = int(1 + rand() * d)
if ( RANDOM in lines ){
print lines[RANDOM]
delete lines[RANDOM]
++e
}
}
}' f.csv > f1.csv
但是,如何改变列?
答案 0 :(得分:1)
以下是使用awk
:
awk '
BEGIN { FS = " *, *"; srand() }
{
for (col=1; col<=NF; col++) {
lines[NR,col] = $col;
columns[col]
}
}
END {
while (1) {
if (fld == NF) { break }
RANDOM = int (1 + rand() * col)
if (RANDOM in columns) {
order[++seq] = RANDOM
delete columns[RANDOM]
++fld
}
}
for (nr=1; nr<=NR; nr++) {
for (fld=1; fld<=seq; fld++) {
printf "%s%s", lines[nr,order[fld]], (fld==seq?RS:", ")
}
}
}' f.csv
b, a, c, d
f, e, g, h
j, i, k, l
答案 1 :(得分:0)
如果你对其他语言开放,这是一个红宝石解决方案:
$ ruby -rcsv -e 'CSV.read(ARGV.shift).shuffle.transpose.shuffle.transpose.each {|row| puts row.to_csv}' f.csv
j, k, l,i
f, g, h,e
b, c ,d,a
Ruby拥有大量的内置功能,包括Arrays上的shuffle
和transpose
方法,这完全适合这个问题。