【问题标题】:How can I use awk to make substitutions using two files?如何使用 awk 使用两个文件进行替换?
【发布时间】:2016-04-01 04:03:23
【问题描述】:

我正在尝试使用 awk 根据 Title 列在第一个 txt 电子表格中进行搜索,如果匹配,则使用此行更改第二个文件。

我第一次尝试使用 comm 但它不起作用。 我在那里找不到任何类似的主题。有人可以帮我吗?

文件1

Title   score   atividade
ZINC79350772    -8.435  1
ZINC71820127    -8.371  1
ZINC65370023    -8.265  1
ZINC13151660    -8.203  1

文件2

ZINC79350772 -8.435 0
ZINC71820127 -8.371 0
ZINC65370023 -8.265 0
ZINC78807290 -8.256 0

期望的输出

ZINC79350772 -8.435 1
ZINC71820127 -8.371 1
ZINC65370023 -8.265 1
ZINC78807290 -8.256 0

【问题讨论】:

  • 欢迎来到 SO,请展示您的编码工作。
  • 我不经常使用join,但我有点让它工作,但这是一个kludge,因为-e 0将丢失的零重新放回:join -e 0 -o 1.1 1.2 2.3 -a1 file2.txt <(sed 1d file1.txt)

标签: bash awk


【解决方案1】:

试试这个经过测试的版本:

(cat FILE1; printf "NEXT_FILE\n"; cat FILE2) | awk '{if ($1 ~ /NEXT_FILE/) {secondfile=1;} else if (!secondfile && NR>1) {score[$1]=$2; actividade[$1]=$3;} else if (secondfile) { if (score[$1]) {$2=score[$1]; $3=actividade[$1];} print;}}' > DESIRED_OUTPUT

cat DESIRED_OUTPUT
ZINC79350772 -8.435 1
ZINC71820127 -8.371 1
ZINC65370023 -8.265 1
ZINC78807290 -8.256 0

它使用关联数组,如著名的Awk - A Tutorial and Introduction - by Bruce Barnett 中所述

在读取 FILE1 时会填充关联数组 scoreactividade

读取 FILE2 时,如果第一次遇到当前标题列,则打印它,否则打​​印首先在 FILE1 中找到的值。

【讨论】:

    【解决方案2】:

    awk 来救援!

    $ awk 'NR==FNR{a[$1]=$3;next} $1 in a{$3=a[$1]} 1' file1 file2
    
    ZINC79350772 -8.435 1
    ZINC71820127 -8.371 1
    ZINC65370023 -8.265 1
    ZINC78807290 -8.256 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 2021-09-24
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      相关资源
      最近更新 更多