我在一个文件中有一些 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
我正在处理的脚本中的文件中执行此操作,但我运气不佳。我一直在一些非常疯狂和徒劳的兔子洞里徘徊,grep
这让我觉得我走错了路(不断的失败是我的罪魁祸首)。
我用一连串的东西标记了这个问题,因为我不完全确定我什至应该使用哪种工具。
编辑:我可能最终会接受鲁本斯的回答,无论它多么古怪,因为它直接包含交换概念(我想我本可以在原始问题中更加强调),它允许我指定一个百分比用于交换的列。它也恰好起作用,这总是一个优点。
对于不需要这个,只想要一个基本的洗牌的人,吉姆加里森的答案也有效(我测试过)。
然而,对鲁本斯的解决方案提出警告。我拿了这个:
for (i = 1; i <= NF; ++i) {
delim = (i != NF) ? "," : "";
...
}
printf "\n";
删除printf "\n";
并将换行符向上移动,如下所示:
for (i = 1; i <= NF; ++i) {
delim = (i != NF) ? "," : "\n";
...
}
因为只是""
在 else 情况下会导致awk
在每行的末尾写入损坏的字符(\00
)。在某一时刻,它甚至设法用汉字替换了我的整个文件。虽然,老实说,这可能让我在这个问题之上做了一些更愚蠢的事情。