【问题标题】:Looping through a table and append information of that table to another file循环遍历一个表并将该表的信息附加到另一个文件
【发布时间】:2016-09-30 12:46:29
【问题描述】:

这是我的第一篇文章,我对 bash 编码相当陌生。 我们在我工作的地方进行了一些实验,为了在 gnuplot 中绘制它,我们需要将反应标签附加到结果。

我们有一个如下所示的文件:

G135b   CH2O+HCO=O2+C2H3
R020b   2CO+H=OH+C2O
R021b   2CO+O=O2+C2O

和一个结果文件(我现在无法访问,抱歉),其中显示文件的第一列是相同的,然后是多个值。它们的顺序不同。 现在我想遍历结果文件并获取第一列的值,在显示的文件中搜索它并将反应标签附加到该行。

  1. 如何遍历结果文件的所有行并获取临时变量中第一列的值? 我想像这样使用这个变量:

    grep -r '^$var' shownfile | awk '{print $2}'
    

    (返回如下内容:CH2O+HCO=O2+C2H3)

  2. 如何将该行的结果附加到结果文件中?

编辑:我还写了一个脚本来从一个看起来像这样的文件:

G135b : 0.178273 C H 2 O + H C O = O 2 + C 2 H 3

对此:

G135b CH2O+HCO=O2+C2H3

这是:

#!/bin/bash
file=$(pwd)
cd $file
# echo "$file"
cut -f1,3 $file/newfile >>tmpfile
sed -i "s/://g" tmpfile
sed -i "s/ //g" tmpfile
cp tmpfile newfile
  1. 如何在文件中执行剪切命令?就像 -i 用于 sed。我的解决方法非常难看,因为它会在当前目录中创建另一个文件。

谢谢你:)

【问题讨论】:

    标签: linux bash loops sh


    【解决方案1】:

    join 命令将在这里工作,它将在每个文件的第一列(默认情况下)对 2 个文件执行内部连接。

    $ cat data
    G135b   CH2O+HCO=O2+C2H3
    R020b   2CO+H=OH+C2O
    R021b   2CO+O=O2+C2O
    
    $ cat result_file
    G135b   a b c
    R020b   a b
    R021b   a b x y z
    
    $ join data result_file
    G135b CH2O+HCO=O2+C2H3 a b c
    R020b 2CO+H=OH+C2O a b
    R021b 2CO+O=O2+C2O a b x y z
    

    【讨论】:

    • 问题是,文件没有排序,所以我必须在第一个文件中搜索等效的第一列。
    • @Thunfisch 你可以像这样排序然后使用连接:join <(sort -k 1 data) <(sort -k 1 result_file)
    • 我刚刚检查了联合命令:我认为这不起作用,因为我们在结果文件中有一些标签文件中不存在的反应。所以在第一种情况下会弹出所有的标签都会搞砸
    • @Thunfisch 不会,它只会输出匹配的记录
    【解决方案2】:

    使用awk,会是这样的:

    NR == FNR { data[$1] = $2; next; }
    { print $0 " " data[$1]; }
    

    将其保存在名为reactions.awk 的文件中,然后调用awk -f reactions.awk shownfile resultfile

    【讨论】:

    • 只是为了做对:这首先检查两个文件的行号是否相同,然后 data[$1] = $2 是什么?下一个是告诉 awk 还有另一个动作要执行吗? Print $0 告诉 awk 打印它正在处理的当前对象,但之后的“”是做什么的?感谢您的帮助:)
    【解决方案3】:
    awk  '{a[$1]=a[$1]$2} END{for (i in a){print i,a[i]}}' file1 file2
    

    【讨论】:

    • a 到底是什么?模式是:如果文件 1 的第 1 行等于文件 2 的第 1 行,则读取该行并在读取结束时执行:打印当前行号和当前行的 a 我做对了吗?
    • 'a' 将从附加的两个文件中收集数据,而不考虑行号并打印出来。第一列后跟附加数据
    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    相关资源
    最近更新 更多