交换价值,我有一些CSV /表格数据在一个文件中,像这样:巴什 - 在
1,7,3,2
8,3,8,0
4,9,5,3
8,5,7,3
5,6,1,9
(他们并不总是数字,只是随机逗号分隔值个位数号码。尽管如此,还是比较容易的。)
我想随机洗牌40%的任何列。举个例子,说第三个。所以也许3和1互相交换。现在,第三列是:
1 << Came from the last position
8
5
7
3 << Came from the first position
我试图从bash
脚本,我的工作中的一个文件来做到这一点的地方,我没有多少运气。我一直徘徊在一些非常疯狂和没有结果的兔子洞口,这让我以为我走错了路(不断的失败是什么让我不知所措)。
我用一连串的东西标记了这个问题,因为我不完全确定我应该为此使用哪个工具。
编辑:我可能会最终接受鲁本斯的答案,但古怪的是,因为它直接包含了交换的概念(我想我可以强调在原来的问题更多),它允许我指定交换列的百分比。它也适用于工作,这总是一个加号。
对于不需要这个的人,只是想要一个基本的洗牌,Jim Garrison的答案也有效(我测试了它)。
但是,鲁本斯的解决方案的警告。我把这个:
for (i = 1; i <= NF; ++i) {
delim = (i != NF) ? "," : "";
...
}
printf "\n";
取出printf "\n";
和移动换行符像这样:
for (i = 1; i <= NF; ++i) {
delim = (i != NF) ? "," : "\n";
...
}
,因为只是在其他情况下,具有""
是造成awk
在每年年底写断字行(\00
)。有一次,它甚至设法用中文字符替换我的整个文件。虽然,说实话,这可能让我在这个问题上做了一些额外的愚蠢行为。
随机化并不的强度文本处理工具,如'sed'或'awk' – 2013-03-19 04:52:55
你想选择40%的列并完全洗牌,或者选择一个(或多个)列并随机洗牌40%? – FoolishSeth 2013-03-19 05:27:43
后者(40%一排柱子N)。 – 2013-03-19 05:28:49