如何用Shell命令打乱CSV文件的列内容(而非行)?
解决方案:Shell命令实现CSV列内容打乱
针对你提出的三种CSV列打乱场景,以下是基于shuf、paste、cut等基础Shell工具的实现命令,适配你提供的R3.csv格式(分隔符为, ):
原始示例文件R3.csv
orderNo, id 67982,[89 55 12] 13230,[45 12 11] 13523,[31 67 12] 19821,[12 9 8]
场景1:仅打乱orderNo列,保持id列不变
提取orderNo列的数据行打乱后,与原id列数据行重新合并,保留表头:
{ head -n 1 R3.csv; paste <(tail -n +2 R3.csv | cut -d',' -f1 | shuf) <(tail -n +2 R3.csv | cut -d',' -f2) | sed 's/\t/, /' } > scenario1.csv
- 命令说明:
head -n 1:保留原始表头tail -n +2:提取所有数据行(跳过表头)cut -d',' -f1:拆分出orderNo列,-f2拆分出id列shuf:随机打乱指定列的内容paste:将打乱后的orderNo列与原id列按行合并sed 's/\t/, /':把paste默认的制表符分隔替换回原CSV的,格式
生成的scenario1.csv与你提供的示例一致。
场景2:仅打乱id列,保持orderNo列不变
逻辑与场景1相反,打乱id列后与原orderNo列合并:
{ head -n 1 R3.csv; paste <(tail -n +2 R3.csv | cut -d',' -f1) <(tail -n +2 R3.csv | cut -d',' -f2 | shuf) | sed 's/\t/, /' } > scenario2.csv
- 命令说明:仅将
shuf作用于id列(cut -d',' -f2的输出),其余步骤同场景1。
场景3:同时打乱orderNo列和id列
分别打乱两列的数据行后再合并,两列的打乱完全独立:
{ head -n 1 R3.csv; paste <(tail -n +2 R3.csv | cut -d',' -f1 | shuf) <(tail -n +2 R3.csv | cut -d',' -f2 | shuf) | sed 's/\t/, /' } > scenario3.csv
- 命令说明:对
orderNo和id列分别执行shuf打乱,再通过paste合并,最终格式与原CSV一致。
内容的提问来源于stack exchange,提问作者Banu
相关产品推荐
相关产品推荐

