【发布时间】:2013-03-19 04:47:07
【问题描述】:
我在一个文件中有一些 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 兔子洞里徘徊,这让我觉得自己走错了路(不断的失败让我失望了)。
我用一连串的东西标记了这个问题,因为我不完全确定我什至应该使用哪种工具。
编辑:我可能最终会接受鲁本斯的回答,不管它多么古怪,因为它直接包含交换概念(我想我本可以在原始问题中更加强调),它允许我指定要交换的列的百分比。它也恰好起作用,这总是一个优点。
对于不需要这个并且只想要基本洗牌的人,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";
...
}
因为在 else 情况下仅使用 "" 会导致 awk 在每行末尾写入损坏的字符 (\00)。有一次,它甚至设法用汉字替换了我的整个文件。虽然老实说,这可能让我在这个问题之上做了一些更愚蠢的事情。
【问题讨论】:
-
随机化不是
sed或awk等文本处理工具的强项。 -
您想选择 40% 的列并完全打乱这些列,还是选择一个(或更多)列并打乱其 40% 的行?
-
后者(一列中 40% 的行)。
-
除了改组不是强项之外,使用任何标记的实用程序都完全不可能进行就地编辑。需要一个外部工具——标准的工具很差。你需要一门真正的语言。
-
是否允许使用 sed/awk?