【问题标题】:Shuffling columns in a delimited csv file改组分隔的 csv 文件中的列
【发布时间】:2024-01-18 20:44:01
【问题描述】:

我有一个 csv 文件:

$ cat test.csv

3424234,123544,263872387,99999,999, "", "", "", ""

我想将第一列和第二列的值交换为其他随机数值。

我一直在尝试使用 awk,到目前为止,我已经设法替换了整行。

$ awk '{$1 = shuf -i 10000000000-99999999999 -n 1; print}' test.csv > suffled.csv
$ cat suffled.csv
0-899999999991

如何进行这种治疗的最佳方法是?

【问题讨论】:

  • 您的术语令人困惑(至少对我而言)。请编辑您的问题以在给定示例输入的情况下显示所需的示例输出。如果我正确理解您的意图,我想您可能会问“如何将第一列和第二列的值替换为其他随机数值?”。祝你好运。

标签: csv perl unix awk sed


【解决方案1】:

awk 不是 shell,因此您不能像从 shell 中那样只从它调用 UNIX 工具。在 awk 中:

$1 = shuf -i 10000000000-99999999999 -n 1

相当于其中一个或类似的(我不会费心弄清楚 awk 将如何解析它):

$1 = 0 -0 10000000000-99999999999 -0 1
$1 = 0 -0 ""-99999999999 -0 ""

因为 shufin 是未设置的 awk 变量,其值为 0 或 null。

这是你想要做的吗?

$ awk 'BEGIN{FS=OFS=","; srand()} {$1=rand(); $2=rand()} 1' file
0.414006,0.899138,263872387,99999,999, "", "", "", ""

或者这个?

$ awk 'BEGIN{FS=OFS=","; srand()} {$1=r(); $2=r()} 1;
    function r(){return int(10000000000+rand()*(99999999999-10000000000+1))}' file
14241542683,61756440367,263872387,99999,999, "", "", "", ""

【讨论】:

  • 他的反应令人难以置信,这正是我想要的,但我没有得到它。谢谢!