【问题标题】:Compare specific columns across multiple files and print matched specific column比较多个文件中的特定列并打印匹配的特定列
【发布时间】:2022-01-01 00:51:40
【问题描述】:

我有多个 csv 格式的文件(六个文件)。我正在尝试比较多个文件中的 $3、$4、$5,如果匹配,则从所有文件中打印 $6 以及来自文件 1 的列 $2、$3、$4、$5。

输入文件1:

Blink,Seeddensity(g/cm^3),1_0002,VU10,37586764,0.458533399568206
Blink,Seeddensity(g/cm^3),1_0004,VU08,37687622,0.548181169267479
Blink,Seeddensity(g/cm^3),1_0006,VU02,6629660,0.553099787284982

输入文件2:

Farmcpu,Seeddensity(g/cm^3),1_0002,VU10,37586764,0.907010463957269
Farmcpu,Seeddensity(g/cm^3),1_0004,VU08,37687622,0.782521980037194
Farmcpu,Seeddensity(g/cm^3),1_0006,VU02,6629660,0.589126094555234

输入文件 3:

GLM,Seeddensity(g/cm^3),1_0002,VU10,37586764,0.24089
GLM,Seeddensity(g/cm^3),1_0004,VU08,37687622,0.25771
GLM,Seeddensity(g/cm^3),1_0006,VU02,6629660,0.31282

期望的输出:

Trait   Marker  Chr Pos Blink   Farmcpu GLM
Seeddensity(g/cm^3) 2_27144 VU08    36984438    1.7853934213866E-11 0.907010463957269   0.24089
Seeddensity(g/cm^3) 2_13819 VU08    21705264    3.98653459293212E-09    0.782521980037194   0.25771
Seeddensity(g/cm^3) 2_07286 VU01    38953729    3.16663946775461E-07    0.589126094555234   0.31282

我已经检查了多个 awk 命令,但这是跨两个文件执行工作的最接近的命令:

awk 'NR==FNR{ a[$2,$3,$4,$5]=$1; next } { s=SUBSEP; k=$2 s $3 s $4 s $5 }k in a{ print $0,a[k] }' File1 File2 > output

join <(sort File1) <(sort File2) | join - <(sort File3) | join - <(sort File4) | join - <(sort File5) | join - <(sort File6) > output

我认为 join 不起作用,因为文件中的第一列不一样,所以我尝试了这个命令:

join -t, -j3 -o 1.2,1.3,1.4,1.5,1.6,2.6,3.6,4.6,5.6,6.6 <(sort -k 3 File1) <(sort -k 3 File2) <(sort -k 3 File3) <(sort -k 3 File4) <(sort -k 3 File5) <(sort -k 3 File6) > output

但我收到一条错误消息: 加入:字段规范中的无效文件号:'3.6'

对于两个文件,以下命令有效,但我不确定如何将它用于多个文件:

join -t, -j3 -o 1.2,1.3,1.4,1.5,1.6,2.6 <(sort -k 3 File1) <(sort -k 3 File2) > output

【问题讨论】:

  • 您说您的输入是 CSV,但您提供的示例输入不是 CSV(也许它是制表符分隔的?)。请更正这两件事中的哪一个是错误的,描述或示例,并提供您自己解决问题的尝试,以便我们为您提供帮助。
  • 文件是csv格式的,我之前是从excel里复制过来的,为了看得更清楚,我加了一些代码。
  • 是的,永远不要提供您的数据的某些表示形式,只需提供您的数据,以便我们可以提供准确的解决方案并复制/粘贴以进行测试。我看到您已将示例输入更新为 CSV,但您的预期输出不是 CSV。这是故意和准确的还是疏忽?如果是后者,请修复它。

标签: join awk


【解决方案1】:

假设您确实想要 CSV 输出,然后使用 GNU awk 进行 ARGIND:

$ cat tst.awk
BEGIN { FS=OFS="," }
{ key = $3 FS $4 FS $5 }
ARGIND < (ARGC-1) {
    val[key,ARGIND] = $6
    next
}
{
    sfx = ""
    for (i=1; i<ARGIND; i++) {
        if ( (key,i) in val ) {
            sfx = sfx OFS val[key,i]
        }
        else {
            next
        }
    }
    print $2, $3, $4, $5, $6 sfx
}

$ awk -f tst.awk file2 file3 file1
Seeddensity(g/cm^3),1_0002,VU10,37586764,0.458533399568206,0.907010463957269,0.24089
Seeddensity(g/cm^3),1_0004,VU08,37687622,0.548181169267479,0.782521980037194,0.25771
Seeddensity(g/cm^3),1_0006,VU02,6629660,0.553099787284982,0.589126094555234,0.31282

对于任何其他 awk,只需在脚本开头添加一行 FNR==1 { ARGIND++ }

【讨论】:

  • 非常感谢,它适用于三个输入文件,但我总共有六个文件,所以如果我尝试提供六个输入文件,它开始将输出添加到前三个输入文件的输出之下
  • 好的,我修改它以适用于任意数量的输入文件。
猜你喜欢
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2016-10-23
  • 2020-11-24
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多