簡體   English   中英

bash:所有行的組合

[英]bash: all combinations of lines

我有以下文件(這是分號分隔;真正的文件是制表符分隔的)

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

我想將每一行與每一行組合在一起,這樣我的輸出就是:

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 while處理(參見注釋)的另一種方法是:

$ awk '{ a[NR]=$0 }                  # index on NR
    END {
        for(i=1;i<=NR;i++)
            for(j=i+1;j<=NR;j++)     # j=i+1 is the magic
                print a[i] ";" a[j]
}' 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應該也可以運行:

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

你可以試試下面一個,它只給你一個與Input_file的字段值相同的順序,只讀一次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

要么

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM