【问题标题】:matrix from data with awk来自 awk 数据的矩阵
【发布时间】:2013-11-30 23:41:24
【问题描述】:

警告,不是 awk 程序员。

我有一个文件,我们称之为file.txt。它有一个数字列表,我将使用它从目录的其余部分(其中包含文件 *.asc)中查找我需要的信息。其余文件的长度不同,但由于我将根据 file.txt 绘制数据,因此我将构建的矩阵将具有相同的行数。然而,所有文件都包含相同数量的列,3。第一列将与 file.txt 进行比较,每个 *.asc 文件的第二列将用于构建矩阵。这是我目前所拥有的:

awk '
    NR==FNR{
        A[$1];
        next}
    $1 in A
       {print $2 >> "data.txt";}' file.txt *.asc

但是,这会将每个文件的信息打印在前一个文件的下方。我想要并排的信息,就像一个矩阵。我查了 paste ,但它似乎在 awk 之前被调用,所有示例都只是几个文件。我尝试了它仍然代替打印,但没有工作。

如果有人可以帮助我,这将是我项目的最后一部分。非常感谢!

【问题讨论】:

  • 您能否提供一个输入文件和所需输出矩阵的简短示例?
  • 当您说某事物应该与其他事物“比较”时,重要的是说明比较是什么——等于、小于、字符串、数字等,所以我们不是在猜测。正如 Marcus 所说,发布一些示例输入和预期输出。
  • file.txt 的格式为: number number number 。 . .这些数字是双倍的。要比较的文件有三列双精度数。我想将 file.txt 中的数字与其他文件中的第一列进行比较。如果数字匹配打印第二个字段,如果不匹配,则打印 -1。这有帮助吗?

标签: database bash matrix awk


【解决方案1】:

你可以试试:

awk -f ext.awk file.txt *.asc > data.txt

ext.awk 在哪里

NR==FNR {
    A[$1]++
    next
}
FNR==1 {
    if (ARGIND > 2)
        print ""
}
$1 in A {
    printf "%s ", $2
}
END {
    print ""
}

更新

如果您没有 Gnu Awk,则 ARGIND 变量不可用。那你可以试试

NR==FNR {
    A[$1]++
    next
}
FNR==1 {
    if (++ai > 1)
        print ""
}
$1 in A {
    printf "%s ", $2
}
END {
    print ""
}

【讨论】:

  • 您应该说明解决方案何时是特定于 gawk 的,因为这是由 ARGIND 提供的,因此 OP 不会浪费时间尝试在他们使用的任何非 GNU awk 上进行调试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 2020-12-15
  • 2019-07-09
  • 2017-06-01
相关资源
最近更新 更多