使用AWK洗牌一行中的单元格

使用AWK洗牌一行中的单元格,awk,shuffle,Awk,Shuffle,我试图洗牌所有有斜杠的列(因此从第5列开始)。然而,我并没有做到这一点,洗牌行很容易,但一行中的单元格我就是搞不懂。必须对每一行单独执行改组 这是我所拥有的数据(这里用1/1,然后1/0等命名) chr110967AT1/11/11/11/01/01/00/01/.1/.0/.0/。 CHR11241CG1/11/11/11/11/11/01/01/.1/.1/.0/ 我想随机化这个顺序(所以不是字段的实际内容,而是它们在行中的位置) chr110967AT1/01/.1/11/11/01/10

我试图洗牌所有有斜杠的列(因此从第5列开始)。然而,我并没有做到这一点,洗牌行很容易,但一行中的单元格我就是搞不懂。必须对每一行单独执行改组

这是我所拥有的数据(这里用1/1,然后1/0等命名)

chr110967AT1/11/11/11/01/01/00/01/.1/.0/.0/。 CHR11241CG1/11/11/11/11/11/01/01/.1/.1/.0/

我想随机化这个顺序(所以不是字段的实际内容,而是它们在行中的位置)

chr110967AT1/01/.1/11/11/01/10/01/.0/.0/...1/0 CHR11241CG./.1/11/11/11/11/11/01/01/.1/.1/.0/

(我自己不是一个很好的随机化者,但我希望我的想法很清楚)

有人知道如何在AWK/GAWK/NAWK中做这样的事情吗(我已经有了一个巨大的AWK脚本,我想将它合并到其中)?我在这里找到的一个脚本很好地随机化了行,但这并不是我想要做的。。。顺便说一下,这个脚本来自

输出:

chr1   10967   A   T   ./.   1/1   1/0   1/1   1/1   0/.   1/0   1/.   1/0   0/.   ./.   1/.   0/0
chr1   13241   C   G   1/1   ./.   1/0   1/0   1/.   1/1   1/1   1/.   1/1   0/.   1/1   1/.   1/.

有一种方法,使用gawk的
asorti()
,我没有将其应用到您的示例中,但我不认为这对您是一个大问题:

awk '{for(i=1;i<=NF;i++)a[i]=$i}
END{for(i in a)
        {
        x = sprintf("%.77f",rand())
        t[x] = a[i]
        }
        asorti(t,m)
        for(j=1;j<=length(m);j++)printf "%s%s", t[m[j]], (j==length(m)?"\n":FS)
}'

这将是缓慢的,但它应该实现您想要的:

BEGIN {srand()}
{ for (i = 5; i <= NF; ++i)
    a[rand()] = $i
  asort(a)
  printf "%s %s %s %s", $1, $2, $3, $4
  for (i = 1; i < NF-5)
     printf " %s", a[i]
  printf "\n"
  delete a
}
BEGIN{srand()}

{for(i=5;我是要随机化的字段,总是在第五到第十七行?或者在不同的行或某些行中有不同数量的字段,而不是所有超过前四行的字段都符合条件?是否需要对每一行进行不同的随机化,或者只是随机化列是可以接受的?@twalberg感谢您的评论。它始终是第5列,直到最后一列,每行的列数相同(这只是一个示例,我的实际文件有108列,超过10^9行)。每一行都需要进行不同的随机化,如果不幸没有用,则随机化列。非常感谢!@Kent,我可以这样做,但这会使它变得更复杂。在我的AWK脚本中,有一个函数可以在一个文件中生成所有这些行,该文件还包含其他类型的行。如果我可以保持在函数的边界内,我不知道我不必关心其他行。作为一个如此大的文件,我认为如果我不必对所有行进行两次检查,它会加快处理速度。
chr1   10967   A   T   ./.   1/1   1/0   1/1   1/1   0/.   1/0   1/.   1/0   0/.   ./.   1/.   0/0
chr1   13241   C   G   1/1   ./.   1/0   1/0   1/.   1/1   1/1   1/.   1/1   0/.   1/1   1/.   1/.
awk '{for(i=1;i<=NF;i++)a[i]=$i}
END{for(i in a)
        {
        x = sprintf("%.77f",rand())
        t[x] = a[i]
        }
        asorti(t,m)
        for(j=1;j<=length(m);j++)printf "%s%s", t[m[j]], (j==length(m)?"\n":FS)
}'
kent$  seq -s ' ' 17|awk '{for(i=1;i<=NF;i++)a[i]=$i}
END{for(i in a)
        {
        x = sprintf("%.77f",rand())
        t[x] = a[i]
        }
        asorti(t,m)
        for(j=1;j<=length(m);j++)printf "%s%s", t[m[j]], (j==length(m)?"\n":FS)
}'
10 4 8 6 16 1 14 2 11 9 12 5 17 7 3 15 13
BEGIN {srand()}
{ for (i = 5; i <= NF; ++i)
    a[rand()] = $i
  asort(a)
  printf "%s %s %s %s", $1, $2, $3, $4
  for (i = 1; i < NF-5)
     printf " %s", a[i]
  printf "\n"
  delete a
}