【问题标题】:using awk to append a file with data from multiple files使用 awk 附加来自多个文件的数据的文件
【发布时间】:2013-12-31 00:12:17
【问题描述】:

我有一个包含 298 行和 2 列的文件 (file1)。我有 48 个其他长度不同的文件(2-298 行),有 6 列,其中第 1 列和第 2 列与 file1 相同。我想通过粘贴文件 2-50 中的第 4 列中的数据来附加 file1,仅当两列都与文件 1 匹配时,以便最终附加的文件将包含 file1 中的第 1 和 2 列以及文件 2-50 中的接下来的 48 列(a 298 行文件,50 列)。如果在文件 2-50 中找不到值,我想要 NA。

文件1:

1   1234
1   48687
2   1234
2   987365
3   97857

文件2:

1   12  234 57
1   1234    3547    72
2   1234    245 17

文件3:

1   1234    249 10
1   48687   250 9

附加文件

1   1234    72  10  file4   file5....
1   48687   NA  9   file4   file5...

【问题讨论】:

  • 使用join 而不是awk。稍后详细说明(如果我有时间。)

标签: awk


【解决方案1】:

您可以尝试以下脚本:

#! /bin/bash    
fn=($(awk 'BEGIN{ for (i=1; i<=49;i++) {print "file"i}}'))
awk -f a.awk ${fn[@]} > append.txt

a.awk 在哪里:

BEGIN {
    N=ARGC-2
}
{
    key=$1 OFS $2
}
NR==FNR {
    a[key]++
    next
}
FNR==1 {j++}
{
    b[key,j]=$4
}
END {
    for (i in a) {
        printf "%s%s", i, OFS
        for (j=1;j<=N;j++) {
            printf "%s",(b[i,j]=="")?"NA":b[i,j]
            printf "%s",(j==N)?ORS:OFS
        }
    }
}

【讨论】:

  • 可以简化fn的赋值:fn=(file{1..49})
  • @WilliamPursell 感谢您的评论。很高兴知道:)
  • 我会试一试,加上额外的建议,我是否只需将整个第一行 fn=($....) 替换为 William 的 fn=(file{1..49} )?
  • 我试了一下,第一部分作为 shell 脚本,第二部分保存为 a.awk。我得到了一个附加文件,但是,它似乎只有 48 个附加列中的 47 个。似乎没有写入48个文件中第一个的数据。有没有解释为什么会这样?脚本运行后原始列顺序(来自附加文件)也不相同,这不是问题;只是好奇。最后,如果我现在想用第 6 列中的数据编写一个文件,我是否只需将 b[key,j]=$4 更改为 b[key,j]=$6 ?谢谢
  • @user3146560 使用关联数组时不保证列顺序。见gnu.org/software/gawk/manual/gawk.html#Arrays 文件应该有所有列,第一个文件中的数据在变量iprintf "%s%s", i, OFS ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多