使用bash或awk随机播放大型csv文件的行和列

时间:2014-09-15 16:56:12

标签: csv awk shuffle

我想创建一个随机混乱大型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

但是,如何改变列?

2 个答案:

答案 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上的shuffletranspose方法,这完全适合这个问题。