bash:所有行的组合

bash:所有行的组合,bash,awk,Bash,Awk,我有以下文件(以分号分隔;实际文件以制表符分隔) 我想把每一行与每一行结合起来,这样我的输出将是: abc;173959;172730;def;4186657;4187943 abc;173959;172730;ghi;4703911;4702577 abc;173959;172730;jkl;2243551;2242259 def;4186657;4187943;ghi;4703911;4702577 def;4186657;4187943;jkl;2243551;2242259 ghi;47

我有以下文件(以分号分隔;实际文件以制表符分隔)

我想把每一行与每一行结合起来,这样我的输出将是:

abc;173959;172730;def;4186657;4187943
abc;173959;172730;ghi;4703911;4702577
abc;173959;172730;jkl;2243551;2242259
def;4186657;4187943;ghi;4703911;4702577
def;4186657;4187943;jkl;2243551;2242259
ghi;4703911;4702577;jkl;2243551;2242259
顺序并不重要

我提出了以下awk解决方案:

awk '{ a[$0] } END { for (i in a){ for (j in a){if (i != j)  print (i "\t" j) } } }' file
但这会打印出两个方向的组合,例如

abc;173959;172730;def;4186657;4187943
def;4186657;4187943;abc;173959;172730
因为我对python或perl非常不熟悉,所以我恳请您使用awk/bash等解决方案。

在awk中:

$ awk '{ a[$0] }
END {
    for(i in a) {
        delete a[i]            # new place for delete
        for(j in a)
            if(i!=j)
                print i ";" j
        # delete a[i]          # previous and maybe wrong place
    }
}' file
def;4186657;4187943;ghi;4703911;4702577
def;4186657;4187943;abc;173959;172730
def;4186657;4187943;jkl;2243551;2242259
ghi;4703911;4702577;abc;173959;172730
ghi;4703911;4702577;jkl;2243551;2242259
abc;173959;172730;jkl;2243551;2242259
不幸的是,顺序是随机的

在处理过程中恢复订单且不修改
a
的另一种方法是(参见注释):

$awk'{a[NR]=$0}NR上的索引
结束{

对于(i=1;i这个
awk
也应该起作用:

awk -F ';' 'NR==FNR{a[++k]=$0; next} {for (i=FNR+1; i<=k; i++) print $0 FS a[i]}' file{,}

abc;173959;172730;def;4186657;4187943
abc;173959;172730;ghi;4703911;4702577
abc;173959;172730;jkl;2243551;2242259
def;4186657;4187943;ghi;4703911;4702577
def;4186657;4187943;jkl;2243551;2242259
ghi;4703911;4702577;jkl;2243551;2242259

awk-F';''NR==FNR{a[++k]=$0;next}{for(i=FNR+1;i请尝试下面的一个,它将通过只读取一次输入文件,为您提供与输入文件的字段值相同的顺序

awk '{a[FNR]=$0} END{j=1;while(length(a)>=++k){for(q=j+1;q<=FNR;q++){print a[j]";"a[q]}j++};}'  Input_file

如果(i
呢?@Phylogenesis你应该写这个作为答案,这似乎是对我来说最好的方法。@Arminius James Brown的解决方案在功能上是等效的,但速度大约是它的两倍。@Phylogenesis啊,我现在看到了(我写评论时不在这里)。是的,当然,作为已删除的条目,工作负载会随着删除而越来越小。在awk中正确定义的(
for i in a
)上循环时,是否正在更改
a
)?也就是说,awk的另一个实现是否会打破这一点?表明它不是(至少在向其中添加项时).这是一个很好的问题,我找不到答案。
delete
与添加项目相比,删除项目似乎是安全的,但我该说谁呢。事实上,那
delete
到底是不是放错地方了?
awk -F ';' 'NR==FNR{a[++k]=$0; next} {for (i=FNR+1; i<=k; i++) print $0 FS a[i]}' file{,}

abc;173959;172730;def;4186657;4187943
abc;173959;172730;ghi;4703911;4702577
abc;173959;172730;jkl;2243551;2242259
def;4186657;4187943;ghi;4703911;4702577
def;4186657;4187943;jkl;2243551;2242259
ghi;4703911;4702577;jkl;2243551;2242259
awk '{a[FNR]=$0} END{j=1;while(length(a)>=++k){for(q=j+1;q<=FNR;q++){print a[j]";"a[q]}j++};}'  Input_file
awk  '
{
  a[FNR]=$0
}
END{
  j=1;
  while(length(a)>=++k){
     for(q=j+1;q<=FNR;q++){
       print a[j]";"a[q]
}
  j++
}
}
'   Input_file
abc;173959;172730;def;4186657;4187943
abc;173959;172730;ghi;4703911;4702577
abc;173959;172730;jkl;2243551;2242259
def;4186657;4187943;ghi;4703911;4702577
def;4186657;4187943;jkl;2243551;2242259
ghi;4703911;4702577;jkl;2243551;2242259